zoukankan      html  css  js  c++  java
  • 第二十八篇 -- 自定义窗口切换

    实现两个窗口的切换,使用信号触发的方式

    在画界面时,经常会遇到切换窗口的问题,那今天介绍的就是n个独立窗口通过隐藏和显示的方法实现视线效果上的窗口切换。

    参考链接:https://blog.csdn.net/he_yang_/article/details/103788918?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-4.control

    效果图:

    为了效果明显,新建了两个ui界面,特别设置了两个UI的大小不一致。

    Form1: 拖动一个button到界面上,修改文字为Form1,保存文件为ui_form1.ui,使用PyUIC得到ui_form1.py。

    Form2: 拖动一个button到界面上,修改文字为form2,并且拉大了窗口,保存文件为ui_form2.ui,使用PyUIC得到ui_form2.py。

    接下来创建一个change_windows.py文件调用这两个界面。

    #!/usr/bin/env python
    # _*_ coding: UTF-8 _*_
    """=================================================
    @Project -> File    : python-20201211 -> change_window.py
    @IDE     : PyCharm
    @Author  : zihan
    @Date    : 2021/1/22 18:25
    @Desc    :
    ================================================="""
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget
    from PyQt5.QtCore import pyqtSignal
    import ui_form1
    import ui_form2
    
    
    class MainWin(QWidget):
        show_sub_win_signal = pyqtSignal()  # 该信号用于展示主窗体
    
        def __init__(self, parent=None):
            super().__init__(parent)  # 调用父类构造函数
            self.ui = ui_form1.Ui_Form()  # 创建UI对象
            self.ui.setupUi(self)  # 构造UI
    
            self.ui.pushButton.clicked.connect(self.go_sub)
    
        def go_sub(self):
            self.show_sub_win_signal.emit()
    
    
    class SubWin(QWidget):
        # 自定义信号
        show_main_win_signal = pyqtSignal()  # 该信号用于展示子窗体
    
        def __init__(self, parent=None):
            super().__init__(parent)  # 调用父类构造函数
            self.ui = ui_form2.Ui_Form()  # 创建UI对象
            self.ui.setupUi(self)  # 构造UI
    
            self.ui.pushButton.clicked.connect(self.go_main)
    
        def go_main(self):
            self.show_main_win_signal.emit()
    
    
    def show_sub():
        subWin.show()
        myWin.hide()
    
    
    def show_main():
        myWin.show()
        subWin.hide()
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        myWin = MainWin()
        myWin.show()
        subWin = SubWin()
        myWin.show_sub_win_signal.connect(show_sub)
        subWin.show_main_win_signal.connect(show_main)
        sys.exit(app.exec_())

    值得注意的地方:

    1. import ui_form1

    以前调用窗口时,写的比较多的是from ui_form1 import UI_Form,那现在两个窗口的class都是UI_Form,所以我们需要区分它们,因此直接import ui_form1

    2. 至少保留一个窗口时show()的状态,这样当关掉所有显示的窗口时,程序会结束。如果某一种情况下设置所有窗口都hide(),那么程序可能结束不了,只有自己强制关闭。

    主窗口打开子窗口,按键触发方式

    效果图:

    这种方式比较适合打开子页面这种,比如为一个工具写about页面。

    主页面:创建一个MainWindow,拖一个Button上去,保存为ui_mainwin.ui,然后pyUIC将ui_mainwin.ui生成ui_mainwin.py

    子页面:创建一个Weight,拖一个label上去,保存为ui_subWin.ui,然后pyUIC将ui_subWin.ui生成ui_subWin.py

    最后,写一个py实现效果图

    #!/usr/bin/env python
    # _*_ coding: UTF-8 _*_
    """=================================================
    @Project -> File    : Runner -> OpenSubWin.py
    @IDE     : PyCharm
    @Author  : Aimee
    @Date    : 2021/3/17 9:56
    @Desc    :
    ================================================="""
    import sys
    from ui_subWin import Ui_Form
    from ui_mainwin import Ui_MainWindow
    from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidgetItem, QFrame, QMenu, QWidget, QMessageBox
    from PyQt5.QtGui import QPalette, QBrush, QPixmap, QFont
    
    
    class SubWin(QWidget):
    
        def __init__(self, parent=None):
            super().__init__(parent)  # 调用父类构造函数
            self.ui = Ui_Form()  # 创建UI对象
            self.ui.setupUi(self)  # 构造UI
            palette = QPalette()
            palette.setBrush(QPalette.Background, QBrush(QPixmap("../imgs/label.jpg")))
            self.setPalette(palette)
            
            
    class QmyMainWindow(QMainWindow):
    
        def __init__(self, parent=None):
            super().__init__(parent)  # 调用父类构造函数
            self.ui = Ui_MainWindow()  # 创建UI对象
            self.ui.setupUi(self)  # 构造UI
            
            self.ui.pushButton.clicked.connect(self.do_button_clicked)
    
        def do_button_clicked(self):
            self.subWin = SubWin()  # self一定需要,不然窗口出来就消失
            self.subWin.show()
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)  # 创建app
        mywindow = QmyMainWindow()
        mywindow.show()
        app.exec_()
    View Code

    注意:获取子窗口类的时候一定不要忘了加self,不然窗口打开后马上就关闭了。

  • 相关阅读:
    linux 日常命令
    apache2 修改默认php版本
    centos 6.5 创建守护进程
    ubuntu18.04 Yii2.0 安装yii2-queue并在Linux启动守护进程监听消息设置
    Ubuntu18.04 使用 deepinwine 安装企业微信后无法查看图片/头像/登陆二维码的解决方法
    CentOS 8安装Redis的两种方式
    如何在ubuntu 18.04中升级python 3.6到3.7
    Navicat 15 premium AppImage格式激活
    爬取彼岸图网实例
    requests库的介绍及get请求 + 小案例
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/14314836.html
Copyright © 2011-2022 走看看