繁体   English   中英

pyqt-类之间的信号错误

[英]pyqt - signal error between classes

我需要主窗口中的字符串才能显示在对话框上,并且我遇到了一些问题...

这是我的代码:

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'

有什么帮助吗?

此行有两个错误:

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_())

我会这样做,以便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/

嗯,著名的'has no attribute connect' ……实际上,在SubDialogUI_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_)

那应该工作。 请注意,您需要将信号连接到某物,如上图所示……

您可能也对此问题感兴趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM