2013-12-13 75 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