0

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

这是我的代码:

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'

有什么帮助吗?

4

3 回答 3

2

这一行有两个错误:

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

首先,这两个方法调用是错误的,其次,您试图将一个连接unbound signal到一个插槽,这是行不通的。

为了使代码正常工作,它需要看起来像这样:

window.drive_signal.connect(dialog.setWindowTitle)

其中window是 的一个实例Ui_MainWindowdialog是 的一个实例SubDialog

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

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

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_())
于 2012-09-10T22:53:12.560 回答
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/

于 2012-09-10T19:27:05.367 回答
1

啊,大名鼎鼎的'has no attribute connect'……其实,in SubDialogUI_MainWindow.drive_signal是一个pyqtSignal,泛型类。您需要使用实例才能将其连接到函数,并且必须在运行时完成此实例化(据我所知)。方法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_)

那应该行得通。请注意,您需要将信号与某些东西连接起来,如上图所示……</p>

您可能也对这个问题感兴趣。

于 2012-09-10T19:49:26.397 回答