2013-12-13 122 views
2

我想使用自動連接功能。我使用的這個例子:pyqt自動連接信號

http://www.eurion.net/python-snippets/snippet/Connecting%20signals%20and%20slots.html

它的工作原理,但我要創造我自己的信號和自己的插槽,例如使用內置的信號。

例如,這裏有一個自定義槽的自定義信號,但不工作:

import sys 
from PyQt4 import QtGui, QtCore 

class SignalsAndSlots(QtGui.QWidget): 

    testSignal = QtCore.pyqtSignal(str,name='testSignal') 



    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.setObjectName('testObject') 
     self.label = QtGui.QLabel(self) 

     QtCore.QMetaObject.connectSlotsByName(self) 
     self.emitSignal() 


    def emitSignal(self): 
     self.testSignal.emit('message') 

    @QtCore.pyqtSlot(str,name='on_testObject_testSignal')  
    def autoSlot(self,msg): 
     self.label.setText(msg) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    gui = SignalsAndSlots() 
    gui.show() 
    app.exec_() 

非常感謝

+0

嘗試發射信號從不同於'self'的對象,並將此對象的引用放入自己。我只能猜測,但我認爲''connectSlotsByName()'不考慮連接對象中的'self'。 – Ber

回答

2

誤碼率是正確的。這將pyqt documentation這樣說:

QMetaObject.connectSlotsByName遞歸搜索所有子對象的給定對象的 [...]

下面是一個簡單的例子,自定義信號:

import sys 
from PyQt4 import QtGui, QtCore 

class CustomButton(QtGui.QPushButton): 
    custom_clicked = QtCore.pyqtSignal(str, name='customClicked') 
    def mousePressEvent(self, event): 
     self.custom_clicked.emit("Clicked!") 

class SignalsAndSlots(QtGui.QWidget): 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     layout = QtGui.QHBoxLayout(self) 
     self.custom_button = CustomButton("Press Me", self) 
     self.custom_button.setObjectName('customButton') 
     self.label = QtGui.QLabel("Nothing...", parent=self) 
     layout.addWidget(self.custom_button) 
     layout.addWidget(self.label) 
     QtCore.QMetaObject.connectSlotsByName(self) 

    @QtCore.pyqtSlot(str, name='on_customButton_customClicked')  
    def autoSlot(self, msg): 
     self.label.setText(msg) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    gui = SignalsAndSlots() 
    gui.show() 
    app.exec_() 

但我認爲你應該考慮不使用對象名稱。新式的信號連接方式更簡潔。這裏是相同的應用程序:

import sys 
from PyQt4 import QtGui, QtCore 

class CustomButton(QtGui.QPushButton): 
    custom_clicked = QtCore.pyqtSignal(str) 
    def mousePressEvent(self, event): 
     self.custom_clicked.emit("Clicked!") 

class SignalsAndSlots(QtGui.QWidget): 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     layout = QtGui.QHBoxLayout(self) 
     self.custom_button = CustomButton("Press Me", self) 
     self.custom_button.setObjectName('customButton') 
     self.label = QtGui.QLabel("Nothing...", parent=self) 
     layout.addWidget(self.custom_button) 
     layout.addWidget(self.label) 
     self.custom_button.custom_clicked.connect(self.on_clicked) 

    def on_clicked(self, msg): 
     self.label.setText(msg) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    gui = SignalsAndSlots() 
    gui.show() 
    app.exec_() 
+0

感謝您解決這個問題! – Ber

+0

謝謝,現在我可以創建一個qtimer,它發出具有自動連接功能的信號。此功能對我來說很有用,因爲我使用的是Qt設計器插件功能。 – Poseidon