2015-02-24 50 views
0

我有一個PyQt小部件,它可以發送帶有numpy.ndarray數據的信號。我還有另一個PyQt小部件,它有一個帶有numpy.ndarray數據的插槽。PyQt:通過Qt設計器連接插槽與自定義對象

這兩個小部件都位於我的主窗口,它是從* .ui文件編譯的。這些小部件被設置爲提升小部件。

難道我無法以某種方式連接Qt Creator中的信號和插槽嗎?

剛纔它給了我一個錯誤:

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

回答

1

原因是Qt的僅支持QMetaType定義的數據類型爲信號的參數傳遞,看起來這裏http://pyqt.sourceforge.net/Docs/PyQt4/qmetatype.html#Q_DECLARE_METATYPE 根據ekhumoro的帖子,我更新下面的代碼,它應該適用於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_() 
+0

'setattr'行什麼都不做,也不需要。在pyqt中沒有辦法註冊新的元類型(也沒有任何需要)。在你的示例代碼中,甚至沒有必要將信號參數類型聲明爲'ndarray' - 使用'object'也可以。 – ekhumoro 2015-02-25 02:11:31

+0

@ ekhumoro,你是對的,不需要使用setattr。 – 2015-02-25 02:27:27