为何使用connectSlotsByName无法关联pyqtgraph InfiniteLine的sigDragged信号?
问题:使用
QMetaObject.connectSlotsByName无法触发InfiniteLine的sigDragged槽函数 我尝试通过QMetaObject.connectSlotsByName自动关联InfiniteLine拖动信号的槽函数,但拖动时函数未触发:
import sys import pyqtgraph as pg from PyQt5.QtCore import pyqtSlot as Slot, Qt, QMetaObject from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class MyMainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent=parent) self.setGeometry(300, 300, 400, 300) self.setWindowTitle('Hello World') self.plot_widget = pg.PlotWidget() self.plot_item = self.plot_widget.plot([1,0,2], pen='b', name='p0') self.vline = pg.InfiniteLine(movable=True, angle=90) self.vline.setObjectName('vline') self.plot_widget.addItem(self.vline) self.setCentralWidget(self.plot_widget) QMetaObject.connectSlotsByName(self) @Slot(object) def on_vline_sigDragged(self, obj): print('dragged') if __name__ == "__main__": app = QApplication(sys.argv) ui = MyMainWindow() ui.show() sys.exit(app.exec_())
但手动关联槽函数时却能正常工作:
self.vline.sigDragged.connect(self.on_vline_sigDragged)
请问这是什么原因?
原因分析
connectSlotsByName的扫描范围限制:这个Qt自动关联机制仅识别Qt原生组件的信号,且要求组件是当前窗口的直接子部件(即通过setParent直接关联到窗口,而非嵌套在其他容器内部)。InfiniteLine是pyqtgraph自定义的Qt子类,sigDragged属于自定义信号,不在Qt元对象系统的自动扫描列表中;同时self.vline被添加到PlotWidget内部,并非MyMainWindow的直接子部件,所以connectSlotsByName无法找到该对象完成关联。手动连接的直接性:直接调用
sigDragged.connect()是将信号与槽函数直接绑定,不受connectSlotsByName的父级关系、信号类型限制,只要参数匹配就能正常触发,因此可以正常工作。
内容的提问来源于stack exchange,提问作者Antony Hatchkins
相关产品推荐
相关产品推荐

