PyQT实现多窗口切换
最近做个软件,用PyQT写的,在实现菜单栏点击弹出新窗口的时候严重被卡壳,发现用WxPython的思想和方式来做完全无法实现。PyQT的中文资料实在是太少了。看了点英文资料和QT的资料,逆推PyQT的实现方法,总算搞定。下面是一个小demo。
主界面的代码如下所示:
#-*-coding:utf-8-*- fromPyQt4importQtCore,QtGui fromdialog1importDialog1 fromdialog2importDialog2 importsys try: _fromUtf8=QtCore.QString.fromUtf8 exceptAttributeError: def_fromUtf8(s): returns try: _encoding=QtGui.QApplication.UnicodeUTF8 def_translate(context,text,disambig): returnQtGui.QApplication.translate(context,text,disambig,_encoding) exceptAttributeError: def_translate(context,text,disambig): returnQtGui.QApplication.translate(context,text,disambig) classMainWindow(QtGui.QWidget): dialog1_signal=QtCore.pyqtSignal()#定义一个无参数的信号,串口设定与子站初始化信号 dialog2_signal=QtCore.pyqtSignal()#定义一个无参数的信号,串口设定与子站初始化信号 exit_signal=QtCore.pyqtSignal()#定义一个无参数的信号,串口设定与子站初始化信号 def__init__(self): super(MainWindow,self).__init__() defsetupUi(self,Form): Form.setObjectName(_fromUtf8("Form")) Form.resize(400,300) self.form=Form self.pushButton=QtGui.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(70,90,75,23)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.pushButton_2=QtGui.QPushButton(Form) self.pushButton_2.setGeometry(QtCore.QRect(240,90,75,23)) self.pushButton_2.setObjectName(_fromUtf8("pushButton_2")) self.pushButton_3=QtGui.QPushButton(Form) self.pushButton_3.setGeometry(QtCore.QRect(150,160,75,23)) self.pushButton_3.setObjectName(_fromUtf8("pushButton_3")) self.label=QtGui.QLabel(Form) self.label.setGeometry(QtCore.QRect(170,40,54,16)) self.label.setObjectName(_fromUtf8("label")) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) #信号连接到指定槽 self.pushButton.clicked.connect(self.on_pushButton_clicked) self.pushButton_2.clicked.connect(self.on_pushButton_2_clicked) self.pushButton_3.clicked.connect(self.on_pushButton_3_clicked) defretranslateUi(self,Form): Form.setWindowTitle(_translate("Form","Form",None)) self.pushButton.setText(_translate("Form","进入dialog1",None)) self.pushButton_2.setText(_translate("Form","进入dialog2",None)) self.pushButton_3.setText(_translate("Form","退出",None)) self.label.setText(_translate("Form","主窗体",None)) defon_pushButton_clicked(self): self.form.hide() Form1=QtGui.QDialog() ui=Dialog1() ui.setupUi(Form1) Form1.show() Form1.exec_() self.form.show() defon_pushButton_3_clicked(self,Form): #QtCore.QObject.connect(self.pushButton_3,QtCore.SIGNAL("clicked()"),self,QtCore.SLOT(quit())) #也可以这样 self.form.close() defon_pushButton_2_clicked(self): self.form.close() Form1=QtGui.QDialog() ui=Dialog2() ui.setupUi(Form1) Form1.show() Form1.exec_() self.form.show() if__name__=='__main__': app=QtGui.QApplication(sys.argv) Form=QtGui.QWidget() window=MainWindow() window.setupUi(Form) Form.show() sys.exit(app.exec_()) pass
Dialog1界面的代码如下:
#-*-coding:utf-8-*- fromPyQt4importQtCore,QtGui try: _fromUtf8=QtCore.QString.fromUtf8 exceptAttributeError: def_fromUtf8(s): returns try: _encoding=QtGui.QApplication.UnicodeUTF8 def_translate(context,text,disambig): returnQtGui.QApplication.translate(context,text,disambig,_encoding) exceptAttributeError: def_translate(context,text,disambig): returnQtGui.QApplication.translate(context,text,disambig) classDialog1(QtGui.QWidget): defsetupUi(self,Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(400,300) self.form=Dialog self.label=QtGui.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(180,50,54,12)) self.label.setObjectName(_fromUtf8("label")) self.dialog1_pushButton=QtGui.QPushButton(Dialog) self.dialog1_pushButton.setGeometry(QtCore.QRect(160,130,75,23)) self.dialog1_pushButton.setObjectName(_fromUtf8("pushButton")) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) #信号连接到指定槽 self.dialog1_pushButton.clicked.connect(self.on_dialog1_pushButton_clicked) defretranslateUi(self,Dialog): Dialog.setWindowTitle(_translate("Dialog","Dialog",None)) self.label.setText(_translate("Dialog","dialog1",None)) self.dialog1_pushButton.setText(_translate("Dialog","返回主窗体",None)) defon_dialog1_pushButton_clicked(self): self.form.close() if__name__=="__main__": importsys app=QtGui.QApplication(sys.argv) Dialog=QtGui.QDialog() ui=Dialog1() ui.setupUi(Dialog) Dialog.show() sys.exit(app.exec_()) Dialog2界面的代码如下: [python]viewplaincopy #-*-coding:utf-8-*- fromPyQt4importQtCore,QtGui try: _fromUtf8=QtCore.QString.fromUtf8 exceptAttributeError: def_fromUtf8(s): returns try: _encoding=QtGui.QApplication.UnicodeUTF8 def_translate(context,text,disambig): returnQtGui.QApplication.translate(context,text,disambig,_encoding) exceptAttributeError: def_translate(context,text,disambig): returnQtGui.QApplication.translate(context,text,disambig) classDialog2(object): defsetupUi(self,Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(400,300) self.form=Dialog self.label=QtGui.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(180,60,54,12)) self.label.setObjectName(_fromUtf8("label")) self.pushButton=QtGui.QPushButton(Dialog) self.pushButton.setGeometry(QtCore.QRect(160,140,75,23)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) #信号连接到指定槽 self.pushButton.clicked.connect(self.on_pushButton_clicked) defretranslateUi(self,Dialog): Dialog.setWindowTitle(_translate("Dialog","Dialog",None)) self.label.setText(_translate("Dialog","dialog2",None)) self.pushButton.setText(_translate("Dialog","返回主窗体",None)) defon_pushButton_clicked(self): self.form.close() if__name__=="__main__": importsys app=QtGui.QApplication(sys.argv) Dialog=QtGui.QDialog() ui=Dialog2() ui.setupUi(Dialog) Dialog.show() sys.exit(app.exec_())
按钮绑定到新弹出界面的处理函数,使用的槽连接方式为:
self.pushButton.clicked.connect(self.on_pushButton_clicked)
如果是Menu项绑定到新弹出界面的处理函数,则应使用的槽连接方式为:
QtCore.QObject.connect(self.set_value_menu,QtCore.SIGNAL(_fromUtf8("triggered()")),self.open_set_value_form)
二者使用的槽处理函数基本一致。
若不显示原界面,只需将原界面hide()即可,如:
self.form.hide()
若需在弹出新窗口时同时原窗口保持可见,则不需这一步。且在这种情况下,若要原窗口可选为顶层窗体,则在显示新窗口时应使用show():
Form1.show()
若新窗口为固定的顶层窗体,原窗体被遮盖,则应使用exec_():
Form1.exec_()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。