• PyQt5快速开发与实战 4.1 QMainWindow


    PyQt5快速开发与实战

    4. 第4章 PyQt5 基本窗口控件

    4.1 QMainWindow

    QMain Window主窗口为用户提供一个应用程序框架,它有自己的布局,可以布局中添加控件。在主窗口中可以添加控件,比如将工具栏、菜单栏和状态栏等添加到布局管理器中。

    4.1.1 窗口类型介绍

    QMainWindow、QWidget和 QDialog三个类都是用来创建窗口的,可以直接使用,也可以继承后再使用。

    • QMain Window窗口可以包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也可以说是 GUI程序的主窗口。

    • QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的。QDialog窗口没有菜单栏、工具栏、状态栏等。

    如果是主窗口,就使用QMainWindow类;如果是对话框,就使用 QDialog类;如果不确定,或者有可能作为顶层窗口,也有可能嵌入到其他窗口中,那么就使用OWidget类。

    4.1.2 创建主窗口

    如果一个窗口包含一个或多个窗口,那么这个窗口就是父窗口,被包含的窗口则是子窗口。没有父窗口的窗口是顶层窗口,QMain Window就是一个顶层窗口,它可以包含很多界面元素,如菜单栏、工具栏、状态栏、子窗口等。

    在PyQt中,在主窗口(QMain Window)中会有一个控件(QWidget)占位符来占着中心窗口,可以使用setCentralWidget()来设置中心窗口。

    QMain Window继承自QWidget类,拥有它的所有派生方法和属性。

    QMainWindow类中比较重要的方法:

    方法描述
    addToolBar()添加工具栏
    centralWidget()返回窗口中心的一个控件,未设置时返回NULL
    menuBar()返回主窗口的菜单栏
    setCentralWidget()设置窗口中心的控件
    setStatusBar()设置状态栏
    statusBar()获得状态栏对象后,调用状态栏对象的showMessage(message, int timeout =0)方法,显示状态栏信息。其中第一个参数是要显示的状态栏信息:第二个参数是信息停留的时间,单位是毫秒,默认是0,表示一直显示状态栏信息

    QMainWindow不能设置布局(使用setLayout()方法),因为它有自己的布局。

    常见主窗口

    import sys
    from PyQt5.QtWidgets import QMainWindow,QApplication
    from PyQt5.QtGui import QIcon
    
    class MainWindow(QMainWindow):
        def __init__(self,parent = None):
            super(MainWindow,self).__init__(parent)
            self.resize(400,200)
            self.status = self.statusBar()
            self.status.showMessage("这是状态栏提示",5000)
            self.setWindowTitle("PyQt MainWindow例子")
    
    if __name__ == '__main__':
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    
        app = QApplication(sys.argv)
        app.setWindowIcon(QIcon("../打包资源文件/pic/cartoon1.ico"))
        form = MainWindow()
        form.show()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    【状态栏中消息显示5秒,5秒后提示信息消失】

    在自定义的窗口类 MainWindow中,继承了主窗口 QMain Window类所有的属性和方法,然后使用父类 QMainWindow 的构造函数super()初始化窗口,再设置窗口标题,最后通过消息循环显示窗口,状态栏可以直接由 statusBar()产生,由showMessage()来显示信息。

    4.1.3 将主窗口放在屏幕中间
    from PyQt5.QtWidgets import QDesktopWidget,QApplication,QMainWindow
    import sys
    
    class Winform(QMainWindow):
        def __init__(self,parent = None):
            super(Winform , self).__init__(parent)
    
            self.setWindowTitle("主窗口放在屏幕中间的例子")
            self.resize(370,250)
            self.center()
    
        def center(self):
            screen = QDesktopWidget().screenGeometry() # 计算显示屏幕的大小
            size = self.geometry()
            self.move((screen.width() - size.width()) / 2 , (screen.height() - size.height()) / 2) # 将窗口移动到屏幕中间
    
    if __name__ == '__main__':
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    
        app = QApplication(sys.argv)
        win = Winform()
        win.show()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    4.1.4 关闭主窗口
    from PyQt5.QtWidgets import QMainWindow,QHBoxLayout,QPushButton,QApplication,QWidget
    import sys
    
    class WinForm(QMainWindow):
        def __init__(self,parent = None):
            super(WinForm,self).__init__(parent)
            self.setWindowTitle("关闭主窗口例子")
            self.button1 = QPushButton("关闭主窗口")
            self.button1.clicked.connect(self.onButtonClick)
    
            layout = QHBoxLayout()
            layout.addWidget(self.button1)
    
            main_frame = QWidget()
            main_frame.setLayout(layout)
            self.setCentralWidget(main_frame)
    
        def onButtonClick(self): # 定义槽函数
            sender = self.sender()
            print(sender.text() + '被按下了')
            qApp = QApplication.instance()
            qApp.quit()
    
    if __name__ == '__main__':
    
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    
        app = QApplication(sys.argv)
        form = WinForm()
        form.show()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    请添加图片描述

    当按钮按下,按钮的clicked信号与onButtonClick槽函数关联

    槽函数中获得QApplication类的对象,调用它的quit()函数来关闭窗口。

  • 相关阅读:
    通过tushare接口完成股票的实际交易的方法有哪些?
    Spark的任务调度
    GD32F303固件库开发(14)----IIC之配置OLED
    计算机组成和体系结构[备考]
    设计模式学习(十五):策略模式
    Recurrent vs. Recursive Neural Networks | 递归神经网络和循环神经网络的RNN之争
    快慢指针判断是不是回文链表
    后台管理----user内容区获取用户数据
    WebShell 木马免杀过WAF
    设计模式-抽象工厂模式
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126006881