返回

PyQt5基本窗口控件(一)QMainWindow

发布时间:2023-01-09 20:18:38 429
# python# 信息# 工具

(PyQt5基本窗口控件(一)QMainWindow)

一、QMainWindow

你好,以下内容,出自王硕和孙洋洋两位的《PyQt5快速开发与实践》这本书,因为这段时间,在学习这一门语言,所以索性就在这里做个笔记。

1、窗口类型介绍

  • QMainWindow、QWidget和QDialog三个类都是用来创建窗口的。
  • 如果是主窗口,就使用QMainWindow类(包含标题栏、菜单栏、工具栏、状态栏等)
  • 如果是对话框,就使用QWidget类
  • 如果不确定,就使用QDialog类

2、创建主窗口

一下是QMainWindow在控件QWidget中,用setCentralWidget()方法设置的中心窗口。

 

QMainWindow类中的主要方法如下:

方法 描述
addTooBar() 添加工具栏
centralWidget() 返回窗口中心的一个控件,未设置时返回
menuBar 返回主窗口菜单
setCentralWidget() 设置窗口中心的控件
setStatusBar() 设置状态栏
statusBar 获得状态栏对象后,调用状态栏对象的showMessage(message,int timeout=0)方法,message是信息,参数是正整数的毫秒数
  • 主窗口QMainWindow不能设置布局,它用自己的布局方法setLayout()

案例一 创建主窗口

# -*- coding:utf-8 -*-
# @Time:2022/12/7 0007 20:08
# @Author:晚秋拾叶
# @File:qt04_QMainWindow.py
# Python之PyCharm


import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QIcon

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(400, 200)
        self.status = self.statusBar()
        self.status.showMessage("这是状态栏提示", 5000)
        self.setWindowTitle("PyQt MainWindow例子")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("./images/头像.ico"))
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())
    
  • 代码分析:
    • status.showMessage("这是状态栏提示", 5000) 就是刚才表格最后一项说明的,“这是状态栏提示”,显示5秒后消失。
    • 自定义窗口MainWindow,继承了主窗口QMainWindow类的所有属性和方法,然后使用父类构造super初始化窗口,再设置窗口标题,最后通过消息循环显示窗口,状态栏可以直接有statusBar()产生,由showMessage()显示信息5秒
  • 效果如下: 

3、将主窗口放在屏幕中间

案例二、主窗口居中显示

# -*- coding:utf-8 -*-
# @Time:2022/12/7 0007 20:19
# @Author:晚秋拾叶
# @File:q04_center.py
# Python之PyCharm

from PyQt5.QtWidgets import QDesktopWidget, QApplication, QMainWindow
import sys

class WinForm(QMainWindow):

    def __init__(self):
        super().__init__()

        self.setWindowTitle("主窗口放在屏幕中间的例子")
        self.resize(370, 250)
        self.center()

    def center(self):
        screen = QDesktopWidget().screenGeometry()
        size = self.geometry()
        self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = WinForm()
    win.show()

    sys.exit(app.exec_())

  • 代码分析:
    • self.resize(370, 250) 该语句设置QWidget窗口大小,宽度是370像素,高度是250像素
    • screen = QDesktopWidget().screenGeometry() 该行语句用来计算显示器屏幕的大小:screen.width()*screen.height(),其中QDesktopWidget()是描述显示屏幕的类(PyQt6已经去掉)
    • size = self.geometry() # 直译是几何构造的函数 该行语句获取QWidget窗口的大小:size.width()*size.height()
    • (int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) 这个语句将窗口移动到屏幕中间,这里与原文不一样,加了int,因为原文的环境已经改变,运行后报错,故改之。
  • 效果如下: 

4、关闭主窗口

案例三、关闭主窗口

# -*- coding:utf-8 -*-
# @Time:2022/12/7 0007 21:04
# @Author:晚秋拾叶
# @File:qt04_closeMainWin.py
# Python之PyCharm

from PyQt5.QtWidgets import QMainWindow, QHBoxLayout, QPushButton, QApplication, QWidget
import sys


class WinForm(QMainWindow):
    def __init__(self):
        super().__init__()
        # 定义主窗口Form的标题
        self.setWindowTitle('关闭主窗口例子')

        # 建立一个按钮button1
        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是发送信号的对象
        sender = self.sender()
        print(sender.text() + '被按下了')

        # 定义一个退出代码,点击quit()
        qApp = QApplication.instance()
        qApp.quit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = WinForm()
    form.show()

    sys.exit(app.exec_())

  • 代码分析:

    • 当单击“关闭主窗口” 后,将关闭显示的窗口。
    • 通过以下代码将按钮的clicked()信号与onButtonClick槽函数关联起来,即发送信号给动作方法函数,执行之。
    • onButtonClick槽函数随时等待信号,它里面有个退出函数quit(),同时通过按钮的text()函数把按钮按下去的信息,在后台打印显示。
  • 效果如下:

  •   
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
Python3.9数据库SQLite3学起(6) 2023-01-09 19:44:19