PyQT实现多窗口切换

最近做个软件,用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数据结构之翻转链表
  • 利用perl、python、php、shell、sed、awk、c 实现字符串的翻转
  • PyQt5每天必学之切换按钮
  • Mac 上切换Python多版本
  • Python切换pip安装源的方法详解
  • python使用pyhook监控键盘并实现切换歌曲的功能
  • python切换hosts文件代码示例
  • PyQt实现界面翻转切换效果
(0)

相关推荐

  • PyQt5每天必学之切换按钮

    切换按钮是QPushButton的特殊模式.它是一个具有两种状态的按钮:按压和未按压.我们通过这两种状态之间的切换来修改其它内容. #!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们创建三个切换按钮. 他们将控制一个QFrame的背景颜色. 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月3日 ""&q

  • Python实现翻转数组功能示例

    本文实例讲述了Python实现翻转数组功能.分享给大家供大家参考,具体如下: 题目描述 给定一个长度为n的整数数组a,元素均不相同,问数组是否存在这样一个片段,只将该片段翻转就可以使整个数组升序排列.其中数组片段[l,r]表示序列a[l], a[l+1], ..., a[r].原始数组为 a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ..., a[r-1], a[r], a[r+1], a[r+2], ..., a[n-1], a[n], 将片段[

  • PyQt实现界面翻转切换效果

    PyQt实现界面翻转切换效果是用qt的场景功能来实现的,用到了QGraphicsView,QGraphicsLinearLayout,QGraphicsWidget等有关qt场景的库.算是对qt场景的一个小小的尝试,涉及内容不深,程序效果并是随心所欲,需要去进一步的改善和提高.暂且先把代码贴在此处,供大家学习和指正. 工程包括四个类: 界面A,TestMainWindow,用来充当翻转效果的A面. 界面B,TestMainWindowTwo,用来充当翻转效果的B面. 绘图界面:TestGraph

  • Python数据结构之翻转链表

    翻转一个链表 样例:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 一种比较简单的方法是用"摘除法".就是先新建一个空节点,然后遍历整个链表,依次令遍历到的节点指向新建链表的头节点. 那样例来说,步骤是这样的: 1. 新建空节点:None 2. 1->None 3. 2->1->None 4. 3->2->1->None 代码就非常简单了: """

  • python使用pyhook监控键盘并实现切换歌曲的功能

    自己在玩dota的时候有时候喜欢边玩游戏边听音乐,但是切换下一曲的时候必须得切出游戏,而切换音乐的热键ctrl+alt+方向键在游戏的时候没有用,好事蛋疼,今天试试使用python来实现键盘监控切换下一曲,下面贴出代码 import pythoncom, pyHook import win32gui,win32api,win32con Lcontrol_press = False Lmenu_press = False Left_press = False def OnKeyboardEvent

  • Mac 上切换Python多版本

    Mac上自带了Python2.x的版本,有时需要使用Python3.x版本做开发,但不能删了Python2.x,可能引起系统不稳定,那么就需要安装多个版本的Python. 1.安装Python3.x版本,我安装了3.6.1: 2.打开终端(terminal),输入:sudo vi ~/.bashrc: 3.在弹出的编辑页面顶部输入并保存: alias python2='/Library/Frameworks/Python.framework/Versions/2.x/bin/python2.x'

  • Python切换pip安装源的方法详解

    一.pip简介 Pip 是安装python包的工具,提供了安装包,列出已经安装的包,升级包以及卸载包的功能. Pip 是对easy_install的取代,提供了和easy_install相同的查找包的功能,因此可以使用easy_install安装的包也同样可以使用pip进行安装. 二.Linux下的源配置 检查pip.conf文件是否存在 >>  cd ~ >>  mkdir .pip >>  ls ~/.pip 三.编辑源  方案1: 直接编辑pip.conf sud

  • 利用perl、python、php、shell、sed、awk、c 实现字符串的翻转

    原题: Q:有a.txt文件,里面内容如下 1234569 abcABCabc 要求使用awk打印出以下结果 987654321 cbaCBAcba A: shell  :[root@vps tmp]# rev a.txt 9654321 cbaCBAcbaperl : [root@vps tmp]# perl -nle 'print scalar reverse $_;' a.txt 9654321 cbaCBAcbaawk: [root@vps tmp]# awk '{num=split($

  • python切换hosts文件代码示例

    win7以上需要使用管理员权限操作. 复制代码 代码如下: # -*- coding: utf-8 -*-import osimport globimport shutil def format_file_list(files):        all_files_str = ""        for i in range(len(files)):                all_files_str +=  str(i)+":"+files[i]+"

  • PyQT实现多窗口切换

    最近做个软件,用PyQT写的,在实现菜单栏点击弹出新窗口的时候严重被卡壳,发现用WxPython的思想和方式来做完全无法实现.PyQT的中文资料实在是太少了.看了点英文资料和QT的资料,逆推PyQT的实现方法,总算搞定.下面是一个小demo. 主界面的代码如下所示: # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui from dialog1 import Dialog1 from dialog2 import Dialog2 impo

  • PyQt 实现使窗口中的元素跟随窗口大小的变化而变化

    * 如果要实现这种视觉状态,那么就需要使用布局的方法. 创建一个控件后,在主窗口上右击选择布局(layout) Lay Out Horizontally : 纵向布局 Lay Out Vertically:横向布局 Lay Out Horizontally in Splitter: 纵向分裂式布局 Lay Out Vertically in Splitter:横向分裂式布局 Lay Out in a Grid: 网格布局 Lay Out in a Form Layout:表布局 Break La

  • PyQt5 窗口切换与自定义对话框的实例

    近日,需要实现一个功能小而全的桌面版软件,所以选中并尝试了PyQt5这个GUI库.在使用中发现,其功能的确完备,但这方面的资料的确不多,有时自己想实现的功能相关资料找不到,有的还不得不阅读C++的实现代码.PyQt5的文档也都是指向C++版的文档.一段时间做下来,特将有关解决方法记录下来,以将来备查,也随手帮助下后来者. 一般来说,GUI软件都是需要不同的工作界面之间进行切换的,当然也少不了布局等功能的使用.Qt的布局功能理解起来也很容易,使用的基本方法是: 1.建立容器部件: 2.建立布局类,

  • python 中pyqt5 树节点点击实现多窗口切换问题

    下面通过实例代码给大家介绍python 中pyqt5 树节点点击实现多窗口切换问题,具体代码如下所示: # coding=utf-8 import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(s

  • Java Selenium实现多窗口切换的示例代码

    在web应用中,常常会遇见点击某个链接会弹出一个新的窗口,或者是相互关联的web应用 ,这样要去操作新窗口中的元素,就需要主机切换到新窗口进行操作.WebDriver 提供了switchTo().window()方法可以实现在不同的窗口之间切换. 获取当前窗口浏览器句柄:driver.getWindowHandle(); 获取所有窗口的浏览器句柄到当前会话:driver.getWindowHandles(); 用于不同窗口的切换:switchTo().window(); 在页面操作过程中有时候点

  • Python爬虫之Selenium多窗口切换的实现

    前言:在页面操作过程中有时候点击某个链接会弹出新的窗口,但由于Selenium的所有操作都是在第一个打开的页面进行的,这时就需要主机切换到新打开的窗口上进行操作.WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换. 以百度首页和百度注册页为例,在两个窗口之间的切换. 本章中用到的关键方法如下: current_window_handle:获得当前窗口句柄 window_handles:返回所有窗口的句柄到当前会话 switch_to.window():

  • Python深度学习实战PyQt5窗口切换的堆叠布局示例详解

    目录 1. 堆叠布局简介 1. 1什么是堆叠布局(Stacked Layout) 1.2 堆叠布局的实现方法 2. 创建多窗口切换的堆叠布局 3. 堆叠布局的主程序设计 3.1 QStackedWidget 类 3.2 建立信号/槽连接 3.3 页面控制程序 3.4 堆叠布局中的控件操作 软件项目中经常需要多种不同的图形界面,以适应不同的任务场景.选项卡控件(QTackedWidget)通过标签选择打开对应的对话框页面,不需要另外编程.堆叠窗口控件(QStackedWidget)在主程序中通过编

  • Python UI自动化测试Web frame及多窗口切换

    目录 一.什么是frame&frame切换? 二.frame切换的方法 三.什么是多窗口&多窗口切换 四.如何实现多窗口切换? 一.什么是frame&frame切换? frame:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素: frame切换:通俗的讲当你进入房子里面,而里面又有一个小房间的话,你不知道小房间在哪,那就是进不去,而frame切换就是进入这个小房间的方式! 这也是为什么要用frame切换的原因! 二.frame切换的方法 解释:在Selen

  • selenium+python自动化测试之多窗口切换

    在很多页面上都有可点击的链接,点击这些链接会打开一个新的窗口,这时如果要在新打开的窗口中操作页面,就需要先切换到新窗口中,如果不进行切换操作,还是操作的上一个页面窗口 浏览器窗口的切换通过句柄(handle)来操作,每个窗口都有一个句柄,代表当前窗口,需要操作哪个页面的窗口,切换到窗口对应的句柄.通过driver.switch_to.window(handle)来切换句柄 在新的窗口中打开页面 打开百度首页,点击右上角的新闻链接,默认会在当前窗口中打开.现在通过修改点击元素的属性,让新打开的页面

随机推荐