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实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
python画一个玫瑰和一个爱心
Aug 18 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
Python中包的用法及安装
Feb 11 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
Python为何不支持switch语句原理详解
Oct 21 Python
python中xlutils库用法浅析
Dec 29 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 Python
总结Python连接CS2000的详细步骤
Jun 23 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
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
PHP 前加at符合@的作用解析
2015/07/31 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
JavaScript String 对象常用方法总结
2016/04/28 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
Node.js学习入门
2017/01/03 Javascript
js实现漫天星星效果
2017/01/19 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
three.js实现3D视野缩放效果
2017/11/16 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
你准备好迎接vue3.0了吗
2020/04/28 Javascript
开始着手第一个Django项目
2015/07/15 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
详解Python IO编程
2020/07/24 Python
Python如何执行系统命令
2020/09/23 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
助理政工师申报材料
2014/06/03 职场文书
交通志愿者活动总结
2014/06/27 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
安装工程师岗位职责
2015/02/13 职场文书
2015年计生协会工作总结
2015/04/24 职场文书