每当拖动无限长线时,我都会使用以下代码调用一个函数.它不会调用该函数.

    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递归搜索匹配子对象,但vline不是主窗口的后代:

for child in self.findChildren(QObject):
    print(child, f'name: {child.objectName()!r}')

# output:

<PyQt5.QtWidgets.QLayout object at 0x71a2f40fa320> | NAME: '_layout'
<pyqtgraph.widgets.PlotWidget.PlotWidget object at 0x71a2f4262050> | NAME: ''
<PyQt5.QtWidgets.QWidget object at 0x71a2f40fa3b0> | NAME: 'qt_scrollarea_hcontainer'
<PyQt5.QtWidgets.QScrollBar object at 0x71a2f40fa440> | NAME: ''
<PyQt5.QtWidgets.QBoxLayout object at 0x71a2f40fa560> | NAME: ''
<PyQt5.QtWidgets.QWidget object at 0x71a2f40fa5f0> | NAME: 'qt_scrollarea_vcontainer'
<PyQt5.QtWidgets.QScrollBar object at 0x71a2f40fa680> | NAME: ''
<PyQt5.QtWidgets.QBoxLayout object at 0x71a2f40fa710> | NAME: ''
<PyQt5.QtWidgets.QWidget object at 0x71a2f42620e0> | NAME: ''
<pyqtgraph.GraphicsScene.GraphicsScene.GraphicsScene object at 0x71a2f4262290> | NAME: ''
<PyQt5.QtCore.QObject object at 0x71a2f40fa7a0> | NAME: ''
<PyQt5.QtWidgets.QAction object at 0x71a2f4262320> | NAME: ''

因此,一个简单的解决方法是显式设置相关对象的父对象:

...
self.vline.setObjectName('vline')
self.vline.setParent(self)

Python相关问答推荐

替换字符串中的多个重叠子字符串

当多个值具有相同模式时返回空

用合并列替换现有列并重命名

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

使用Python更新字典中的值

使用NeuralProphet绘制置信区间时出错

joblib:无法从父目录的另一个子文件夹加载转储模型

让函数调用方程

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

如何使用两个关键函数来排序一个多索引框架?

在pandas/python中计数嵌套类别

OpenCV轮廓.很难找到给定图像的所需轮廓

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

关于两个表达式的区别

裁剪数字.nd数组引发-ValueError:无法将空图像写入JPEG

如何获得满足掩码条件的第一行的索引?

迭代工具组合不会输出大于3的序列

如何在Python中画一个只能在对角线内裁剪的圆?

多个布尔条件的`jax.lax.cond`等效项

将参数从另一个python脚本中传递给main(argv