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_()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。