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

    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相关问答推荐

Python会扔掉未使用的表情吗?

Pandas 第二小值有条件

如何比较numPy数组中的两个图像以获取它们不同的像素

如何在虚拟Python环境中运行Python程序?

在Python中管理打开对话框

通过pandas向每个非空单元格添加子字符串

使用groupby Pandas的一些操作

PyQt5,如何使每个对象的 colored颜色 不同?'

为一个组的每个子组绘制,

实现神经网络代码时的TypeError

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

在Python中计算连续天数

如何防止Pandas将索引标为周期?

为什么调用函数的值和次数不同,递归在代码中是如何工作的?

干燥化与列姆化的比较

如何删除重复的文字翻拍?

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

在round函数中使用列值

更新包含整数范围的列表中的第一个元素