【问题标题】:PyQt: connecting slots with custom objects via Qt DesignerPyQt:通过 Qt Designer 将插槽与自定义对象连接起来
【发布时间】:2015-02-25 10:26:44
【问题描述】:

我有一个 PyQt 小部件,它使用 numpy.ndarray 数据发送信号。我还有另一个 PyQt 小部件,它有一个带有 numpy.ndarray 数据的插槽。

这两个小部件都位于我的主窗口上,它是从 *.ui 文件编译的。这些小部件被设置为提升的小部件。

我不能以某种方式连接 Qt Creator 中的信号和插槽吗?

刚才它给了我下一个错误:

TypeError: C++ type 'ndarray' is not supported as a slot argument type

【问题讨论】:

    标签: qt numpy pyqt


    【解决方案1】:

    这是因为 Qt 只支持 QMetaType 中定义的数据类型作为信号参数传递,看这里http://pyqt.sourceforge.net/Docs/PyQt4/qmetatype.html#Q_DECLARE_METATYPE 根据 ekhumoro 的 POST,我更新了以下代码,它应该适用于 PyQt4,而不是在 PyQt5 上测试。

    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    from numpy import *
    
    
    class MyThread(QThread):
        mysignal = pyqtSignal(ndarray)
    
        def __init__(self, parent=None):
            super(MyThread, self).__init__(parent)
    
        def run(self):
            while True:
                QThread.msleep(100)
                self.mysignal.emit(array((1, 2, 3, 4)))
    
    
    class MyWidget(QWidget):
        def __init__(self, parent=None):
            super(MyWidget, self).__init__(parent)
            self.thread = MyThread()
            self.thread.mysignal.connect(self.handleSignal)
            self.thread.start()
    
        def handleSignal(self, data):
            print data
    
    
    if __name__ == '__main__':
        import sys
    
        app = QApplication(sys.argv)
        w = MyWidget()
        w.show()
        app.exec_()
    

    【讨论】:

    • setattr 行什么都不做,也不需要。没有办法在 pyqt 中注册新的元类型(也没有必要)。在您的示例代码中,甚至不需要将信号参数类型声明为 ndarray - 使用 object 也可以。
    • @ekhumoro,你是对的,不需要使用 setattr 。
    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多