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

この行には 2 つのエラーがあります。

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

1 つ目は、2 つのメソッド呼び出しが間違った方向に回っていることです。2 つ目はunbound signal、スロットに を接続しようとしていますが、これは機能しません。

コードが機能するには、次のようにする必要があります。

window.drive_signal.connect(dialog.setWindowTitle)

ここで、windowは のインスタンスでありUi_MainWindowdialogは のインスタンスですSubDialog

残りのコードの記述方法を考えると、クラスの初期化方法にも潜在的な問題がある可能性があります。

以下のコードは、シグナルを正しく機能させる 1 つの方法を示しています。イベント ループを開始する前に、処理の順序に注意してください。

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はSubDialog,ジェネリック クラスです。インスタンスを関数に接続できるようにするには、インスタンスを使用する必要があり、このインスタンス化は実行時に行う必要があります (私が理解している限り)。その方法と方法は、オブジェクトのクラス属性を調べることです。つまり、信号を発信する場所だけでなく、信号をキャッチする場所定義する必要があります。UI_MainWindow.drive_signalpyqtSignalPyQtPySidePyQt

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 に答える