PyQT实现多窗口切换


Posted in Python onApril 20, 2018

最近做个软件,用PyQT写的,在实现菜单栏点击弹出新窗口的时候严重被卡壳,发现用WxPython的思想和方式来做完全无法实现。PyQT的中文资料实在是太少了。看了点英文资料和QT的资料,逆推PyQT的实现方法,总算搞定。下面是一个小demo。

主界面的代码如下所示:

# -*- coding: utf-8 -*- 
 
from PyQt4 import QtCore, QtGui 
from dialog1 import Dialog1 
from dialog2 import Dialog2 
import sys 
 
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 MainWindow(QtGui.QWidget):  
   
  dialog1_signal = QtCore.pyqtSignal()     #定义一个无参数的信号,串口设定与子站初始化信号 
  dialog2_signal = QtCore.pyqtSignal()     #定义一个无参数的信号,串口设定与子站初始化信号 
  exit_signal = QtCore.pyqtSignal()     #定义一个无参数的信号,串口设定与子站初始化信号 
   
  def __init__(self): 
    super(MainWindow,self).__init__() 
     
  def setupUi(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) 
     
     
  def retranslateUi(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)) 
     
  def on_pushButton_clicked(self): 
    self.form.hide() 
    Form1 = QtGui.QDialog() 
    ui = Dialog1() 
    ui.setupUi(Form1) 
    Form1.show() 
    Form1.exec_() 
    self.form.show() 
 
  def on_pushButton_3_clicked(self, Form): 
    #QtCore.QObject.connect( self.pushButton_3, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT(quit())) 
    #也可以这样 
    self.form.close() 
     
  def on_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 -*- 
 
from PyQt4 import QtCore, QtGui 
 
 
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 Dialog1(QtGui.QWidget): 
  def setupUi(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) 
     
  def retranslateUi(self, Dialog): 
    Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) 
    self.label.setText(_translate("Dialog", "dialog1", None)) 
    self.dialog1_pushButton.setText(_translate("Dialog", "返回主窗体", None)) 
 
  def on_dialog1_pushButton_clicked(self): 
    self.form.close() 
 
if __name__ == "__main__": 
  import sys 
  app = QtGui.QApplication(sys.argv) 
  Dialog = QtGui.QDialog() 
  ui = Dialog1() 
  ui.setupUi(Dialog) 
  Dialog.show() 
  sys.exit(app.exec_()) 
   

Dialog2界面的代码如下:
[python] view plain copy
# -*- coding: utf-8 -*- 
 
from PyQt4 import QtCore, QtGui 
 
 
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 Dialog2(object): 
  def setupUi(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) 
     
  def retranslateUi(self, Dialog): 
    Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) 
    self.label.setText(_translate("Dialog", "dialog2", None)) 
    self.pushButton.setText(_translate("Dialog", "返回主窗体", None)) 
     
  def on_pushButton_clicked(self): 
    self.form .close() 
 
if __name__ == "__main__": 
  import sys 
  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_()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python修改操作系统时间的方法
May 18 Python
python函数形参用法实例分析
Aug 04 Python
Python随机生成带特殊字符的密码
Mar 02 Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
python字符串常用方法
Jun 14 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
Jul 10 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
Pytorch基本变量类型FloatTensor与Variable用法
Jan 08 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 #Python
浅析python打包工具distutils、setuptools
Apr 20 #Python
PyQt5每天必学之切换按钮
Aug 20 #Python
PyQt5每天必学之滑块控件QSlider
Apr 20 #Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 #Python
PyQt5每天必学之组合框
Apr 20 #Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 #Python
You might like
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
JS实现php的伪分页
2008/05/25 PHP
PHP 存储文本换行实现方法
2010/01/05 PHP
php学习之运算符相关概念
2011/06/09 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
JS DOM 操作实现代码
2010/08/01 Javascript
validator验证控件使用代码
2010/11/23 Javascript
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
Python实现方便使用的级联进度信息实例
2015/05/05 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
详解python3中zipfile模块用法
2018/06/18 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
python中count函数简单用法
2020/01/05 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
家长给幼儿园的表扬信
2014/01/09 职场文书
《画》教学反思
2014/04/14 职场文书
协议书范本
2014/04/23 职场文书
大学学风建设方案
2014/05/04 职场文书
模特大赛策划方案
2014/05/28 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书