pyqt - 类之间的信号错误

时间:2012-09-10 18:57:54

标签: python pyqt pyqt4 signals-slots

我需要在主窗口中显示一个字符串才能在对话框中显示并且我有一些问题......

继承我的代码:

class Ui_MainWindow(QtGui.QMainWindow):
    drive_signal = QtCore.pyqtSignal(str)

    def setupUi(self, MainWindow):
       MainWindow.setObjectName(_fromUtf8("MainWindow"))
       MainWindow.resize(459, 280)
       ..... #non relevant code
       .....

       drives = win32api.GetLogicalDriveStrings()
       drives = drives.split('\000')[:-1][1:]
       self.drive_combo.clear()
       self.drive_combo.addItems(drives)
       self.drive_signal.emit(self.drive_combo.currentText())
       ..... 
       .....

class SubDialog(QtGui.QDialog):
    def setupUi(self, Dialog):
       Dialog.setWindowTitle(Ui_MainWindow.drive_signal.connect())
       Dialog.resize(532, 285)
       ..... 
       .....

但是我收到了这个错误:

AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect'

任何帮助?

3 个答案:

答案 0 :(得分:2)

此行有两个错误:

Dialog.setWindowTitle(Ui_MainWindow.drive_signal.connect())

首先,两个方法调用是错误的,其次,您试图将unbound signal连接到一个无法正常工作的插槽。

要使代码生效,需要看起来像这样:

window.drive_signal.connect(dialog.setWindowTitle)

其中windowUi_MainWindow的实例,dialogSubDialog的实例。

考虑到编写其余代码的方式,初始化类的方式也可能存在潜在问题。

下面的代码显示了一种使信号正常工作的方法。在开始事件循环之前,请仔细记录事情的完成顺序:

from PyQt4 import QtGui, QtCore

class Ui_MainWindow(QtGui.QMainWindow):
    drive_signal = QtCore.pyqtSignal(str)

    def setupUi(self, MainWindow):
        MainWindow.resize(459, 280)
        MainWindow.setWindowTitle('MainWindow: Foo')
        self.drive_signal.emit('Dialog: Bar')

class SubDialog(QtGui.QDialog):
    def setupUi(self, Dialog):
        Dialog.resize(532, 285)

if __name__ == '__main__':

    import sys

    app = QtGui.QApplication(sys.argv)

    window = Ui_MainWindow()
    dialog = SubDialog()

    window.drive_signal.connect(dialog.setWindowTitle)

    window.setupUi(window)
    dialog.setupUi(dialog)

    window.show()
    dialog.show()

    sys.exit(app.exec_())

答案 1 :(得分:1)

我会这样做,以便Ui_MainWindow发出信号:

self.emit(SIGNAL("something_happened"), self.drive_combo.currentText())

然后在另一个对象中以旧式方式连接它:

mainWindow.something_happened.connect(self.change_windowTitle)

def change_window_title(self, text):
    dialog.setWindowTitle(text)

这可能有所帮助:http://www.saltycrane.com/blog/2008/01/pyqt-how-to-pass-arguments-while/

答案 2 :(得分:1)

啊,着名的'has no attribute connect' ......事实上,在SubDialog中,UI_MainWindow.drive_signalpyqtSignal,即通用类。您需要使用一个实例才能将它连接到一个函数,并且这个实例必须在运行时完成(据我所知)。 PyQtPySide知道如何操作的方式是查看PyQt对象的类属性。换句话说,你必须定义信号不仅你要发射它的位置,还要 来捕捉它。

class SubDialog(QtGui.QDialog):
    drive_signal = QtCore.pyqtSignal(str)

    def setupUi(self, Dialog):
        self.dialog_ui = Dialog
        self.drive_signal.connect(self.on_drive_signal))
        …

    def on_drive_signal(self, str_):
        self.dialog_ui.setWindowTitle(str_)

那应该有用。请注意,您需要将信号与某些东西连接起来,如上图所示......

您可能也对this question感兴趣。