2014-04-07 30 views
1

我創建一個使用2個窗口簡單的應用程序,我想用pyqtsignal與按鈕連接,但是當我運行的應用程序的顯示信息「類型錯誤:pyqtSignal必須綁定到一個QObject,而不是‘Form1的’」:如何在PyQt中使用pyqtSignal連接2個窗口?

from PyQt4 import QtCore, QtGui 
import form2 
import sys 
from functools import partial 
from PyQt4.QtCore import pyqtSignal 
from lib2to3.fixer_util import String 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Form1(QtGui.QMainWindow): 
    Form2Signal = pyqtSignal(str, str) 

    def __init__(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(319, 147) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.bt_form1 = QtGui.QPushButton(self.centralwidget) 
     self.bt_form1.setGeometry(QtCore.QRect(110, 30, 101, 41)) 
     self.bt_form1.setObjectName(_fromUtf8("bt_form1")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 319, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     self.bt_form1.clicked.connect(self.Form2Signal.emit(String)) 
     MainWindow.setWindowTitle(_translate("MainWindow", "Form_1", None)) 
     self.bt_form1.setText(_translate("MainWindow", "FORM_1", None)) 

class Form2(QtGui.QMainWindow): 
    Form1Signal = pyqtSignal(str, str) 

    def __init__(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(319, 147) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.bt_form2 = QtGui.QPushButton(self.centralwidget) 
     self.bt_form2.setGeometry(QtCore.QRect(110, 30, 101, 41)) 
     self.bt_form2.setObjectName(_fromUtf8("bt_form2")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 319, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     self.bt_form2.clicked.connect(self.Form1Signal.emit) 
     MainWindow.setWindowTitle(_translate("MainWindow", "Form_2", None)) 
     self.bt_form2.setText(_translate("MainWindow", "FORM_2", None)) 

class MainWidget(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWidget, self).__init__(parent) 
     self.stack = QtGui.QStackedWidget() 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.stack) 
     self.form1 = Form1(self) 
     self.form2 = Form2(self) 
     self.stack.addWidget(self.form1) 
     self.stack.addWidget(self.form2) 
     self.form1.Form2Signal.connect(partial(self.stack.setCurrentWidget,self.form2)) 
     self.form2.Form1Signal.connect(partial(self.stack.setCurrentWidget,self.form1)) 
     self.stack.setCurrentWidget(self.form1) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    w = MainWidget() 
    w.show() 
    app.exec_() 
    sys.exit() 
+0

這樣的線'self.bt_form1.clicked.connect(self.Form2Signal.emit(String))'沒有任何意義。你試圖用這行代碼做什麼?這也可能是一個好主意,通過閱讀教程來重新理解信號和插槽,如下所示:http://zetcode.com/gui/pyqt4/eventsandsignals/這種方式你可以解釋你正在嘗試做什麼稍微好一些,我們將能夠幫助 –

回答

0

super(Form1, self).__init__()__init__Form1類的方法。做同樣的Form2

+0

雖然您確定缺少此行,但它不會修復發佈的錯誤。你真的運行過代碼嗎? –

+0

是的我做了,它修復了錯誤TypeError:pyqtSignal必須綁定到一個QObject,而不是'Form1'給下一個錯誤女巫是關於錯誤的信號參數,這是一個新的問題的材料。 – Aleksandar

+0

我已經運行它,但是當直接運行時顯示窗體2,並且出現錯誤「QLayout:試圖將QLayout」添加到MainWidget「」,它已經有一個佈局「」,你知道這個問題嗎? – Bekti