如何为PyQt5的QDockWidget创建触发信号?
QDockWidget实现类似QTabWidget的点击触发功能
QDockWidget本身没有currentChanged或Clicked这类信号,需根据实际需求选择对应的信号连接方式,以下是两种常见场景的解决方案:
场景1:点击QDockWidget内的列表项时触发
QDockWidget内部的QListWidget提供了多个可用于触发的信号,比如currentRowChanged(选中行变化时触发)或itemClicked(点击列表项时触发),直接连接这些信号即可:
修改后的完整代码
from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui from PyQt5.QtGui import * from PyQt5.QtCore import * import sys class Window(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("OOP") self.uinterface() self.show() def uinterface(self): self.dock = QDockWidget("OOP example", self) self.listWidget = QListWidget() self.listWidget.addItem("One") self.listWidget.addItem("Two") self.listWidget.addItem("Three") self.dock.setWidget(self.listWidget) # 连接列表项选中变化信号到处理函数 self.listWidget.currentRowChanged.connect(self.on_tab_changed) # 将dock添加到主窗口(必须添加才能显示) self.addDockWidget(Qt.LeftDockWidgetArea, self.dock) def on_tab_changed(self, index: int) -> None: print(f"选中第{index}项,DO SOMETHING") App = QApplication(sys.argv) window = Window() sys.exit(App.exec())
如果需要获取点击的具体列表项内容,可改用itemClicked信号:
# 替换信号连接行 self.listWidget.itemClicked.connect(self.on_item_clicked) # 对应的处理函数 def on_item_clicked(self, item: QListWidgetItem) -> None: print(f"点击了{item.text()},DO SOMETHING")
场景2:QDockWidget被激活(获得焦点)时触发
如果需要在QDockWidget切换为活跃状态(比如从其他dock/窗口切换到该dock)时触发,可使用QMainWindow的dockWidgetActivated信号:
修改后的关键代码
def uinterface(self): # ... 其他代码不变 ... self.addDockWidget(Qt.LeftDockWidgetArea, self.dock) # 连接dock激活信号 self.dockWidgetActivated.connect(self.on_dock_activated) def on_dock_activated(self, dock: QDockWidget) -> None: # 判断激活的是目标dock时执行操作 if dock == self.dock: print("当前dock被激活,DO SOMETHING")
也可使用QDockWidget的visibilityChanged信号,在dock可见性变化时触发:
# 替换信号连接行 self.dock.visibilityChanged.connect(self.on_dock_visibility_changed) # 对应的处理函数 def on_dock_visibility_changed(self, visible: bool) -> None: if visible: print("dock变为可见,DO SOMETHING")
内容的提问来源于stack exchange,提问作者afernandezody
相关产品推荐
相关产品推荐

