PyQt学习笔记-基本窗体

news2024/12/28 19:47:32

记述PyQt的基本窗体信息和基本操作。

一、主窗体类(QMainWindow)

主窗体类是通用的主窗体,包含菜单栏(QMenuBar),工具栏(QToolBars),悬停部件(QDockWidgets)、中央部件(Central Widget)、状态栏(QStatusBar)等基本类型。

PyQt6中的描述详见:QMainWindow — PyQt Documentation v6.4.0 (riverbankcomputing.com)

    • 创建主窗体

QMainWindow一般是用作顶层窗体,一般通过继承,然后再基础上创建自己的布局。

class MainWindow(QMainWindow):
    """主窗体类"""
    def __init__(self):
        """构造函数"""
        super(MainWindow,self).__init__()        # 调用父类初始化函数,需要调用父类初始化才能正常使用父类定一的变量
        # 其他代码块
    • 设置主窗体中间控件布局

QMainWindow类有自己的布局,无法使用setLayout()方法布局,也不能嵌入到其他窗口,只能作为顶层窗口,创建布局只能在CentralWidget中创建,调用中央部件的setLayout()方法。

self.central_widget = QWidget()
self.central_widget.setLayout(layout)
self.setCentralWidget(self.central_widget)
    • 状态栏

QMainWindow有自带的状态栏,可以通过statusBar()方法获取自身的状态栏,或者通过实例化QStatusBar类,然后使用QMainWindow.setStatusBar()方法将状态栏添加到主窗体。

可通过状态栏的addPermanentWidget()方法添加多个控件用于显示信息

示例1,直接获取状态栏:

        # 直接获取状态栏
        self.statusBar = self.statusBar()
        self.statusBar.showMessage("显示状态栏信息",5000)

结果:

示例2,实例化之后再添加到主窗体中:

        # 实例化状态栏后再添加到主窗体中
        self.statusBar = QStatusBar()
        self.setStatusBar(self.statusBar)
        self.statusBar.showMessage("显示状态栏信息",5000)

结果:

    • 菜单栏

通过调用QMainWindow的menuBar方法即可得到菜单栏,然后通过addMenu()方法添加QMenu主菜单,然后再主菜单下进一步添加菜单或子菜单。

addMenu()方法如下:

  • addMenu(self, menu: QMenu) -> QAction: ...

  • addMenu(self, title: str) -> QMenu: ...

  • addMenu(self, icon: QtGui.QIcon, title: str) -> QMenu: ...

QMenu常用方法如下:

  • QMenu.addAction(QAction):添加菜单项;

  • QMenu.addSeparator:添加分割线;

  • QMenu.addMenu(QMenu):添加子菜单;

  • QMenu.addMenu(QIcon,str):添加带图标的子菜单

示例:

# _*_ coding:utf-8 _*_

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QMainWindow, QVBoxLayout, QHBoxLayout
from PyQt6.QtGui import QIcon,QAction

class MainWindowView(QMainWindow):
    """主窗体界面"""

    def __init__(self):
        """构造函数"""
        super().__init__()

        self.setWindowTitle("MainWindow")
        self.setWindowIcon(QIcon(r"./res/folder_pictures.ico"))
        self.resize(300,200)
        self.setMinimumSize(600,400)

        self.initUI()

    def initUI(self):
        """初始函数"""

        self.vboxlayout = QVBoxLayout(self)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.vboxlayout)
        self.setCentralWidget(self.main_widget)

        self.hboxlayout = QHBoxLayout(self)

        # 获取状态栏
        self.statusBar = self.statusBar()
        self.statusBar.showMessage("显示状态栏信息",10000)

        # 获取菜单栏
        self.mbar = self.menuBar()

        # 添加文件菜单
        self.menu_file = self.mbar.addMenu("文件")
        # 添加设置菜单
        self.menu_settings = self.mbar.addMenu("设置")

        # 添加文件菜单的菜单项
        # 打开菜单
        self.action_open = QAction(QIcon("./res/20 (3).ico"),"打开",self)
        self.action_open.setStatusTip("打开文件")
        self.action_open.triggered.connect(lambda : print("打开文件"))

        self.menu_file.addAction(self.action_open)  # 添加到菜单中

        # 保存菜单
        self.action_save = QAction("保存")
        self.menu_file.addAction(self.action_save)

        # 添加分隔符
        self.menu_file.addSeparator()

        # 添加子菜单-用户
        self.submenu_user = self.menu_file.addMenu("用户")
        
        self.action_group = self.submenu_user.addAction("用户组")
        self.action_single = self.submenu_user.addAction("个人权限")

        # 添加分隔符
        self.menu_file.addSeparator()

        # 添加推出菜单项
        self.action_quit = self.menu_file.addAction("退出")
        


    def center(self):
        """居中显示"""
        self.win_rect = self.frameGeometry()     #获取窗口矩形
        self.screen_center = self.screen().availableGeometry().center()      #屏幕中心
        self.win_rect.moveCenter(self.screen_center)      # 移动窗口矩形到屏幕中心
        self.move(self.win_rect.center)         # 移动窗口与窗口矩形重合

        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    view = MainWindowView()
    view.show()
    sys.exit(app.exec())

结果:

    • 工具栏

工具栏可以有多个,而且可以设置不同的位置参数。

5.1工具栏位置参数

  • QtCore.Qt.ToolBarArea.LeftToolBarArea

  • QtCore.Qt.ToolBarArea.RightToolBarArea

  • QtCore.Qt.ToolBarArea.TopToolBarArea

  • QtCore.Qt.ToolBarArea.BottomToolBarArea

  • QtCore.Qt.ToolBarArea.AllToolBarAreas

  • QtCore.Qt.ToolBarArea.NoToolBarArea

5.2 工具栏添加方式

QMainWindow直接调用addToolBar()方法添加工具栏.

  • addToolBar(self, area: QtCore.Qt.ToolBarArea, toolbar: 'QToolBar') -> None: ...

  • addToolBar(self, toolbar: 'QToolBar') -> None: ...

  • addToolBar(self, title: str) -> 'QToolBar': ...

示例:

# _*_ coding:utf-8 _*_

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QMainWindow, QVBoxLayout, QHBoxLayout,QToolBar
from PyQt6.QtGui import QIcon,QAction
from PyQt6.QtCore import Qt

class MainWindowView(QMainWindow):
    """主窗体界面"""

    def __init__(self):
        """构造函数"""
        super().__init__()

        self.setWindowTitle("MainWindow")
        self.setWindowIcon(QIcon(r"./res/folder_pictures.ico"))
        self.resize(300,200)
        self.setMinimumSize(600,400)

        self.initUI()

    def initUI(self):
        """初始函数"""

        self.vboxlayout = QVBoxLayout(self)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.vboxlayout)
        self.setCentralWidget(self.main_widget)

        self.hboxlayout = QHBoxLayout(self)

        # 获取状态栏
        self.statusBar = self.statusBar()
        self.statusBar.showMessage("显示状态栏信息",10000)

        # 获取工具栏
        self.toolbar_file = self.addToolBar("文件")

        # 打开工具项
        self.action_open = QAction(QIcon("./res/20 (3).ico"),"打开",self)
        self.action_open.setStatusTip("打开文件")
        self.action_open.triggered.connect(lambda : print("打开文件"))

        self.toolbar_file.addAction(self.action_open)  # 添加到菜单中

        # 保存工具项
        self.action_save = QAction("保存")
        self.toolbar_file.addAction(self.action_save)

        # 添加分隔符
        self.toolbar_file.addSeparator()

        # 添加退出工具项
        self.action_quit = self.toolbar_file.addAction("退出")

        # 添加工具栏-权限
        self.toolbar_limits = QToolBar()
        self.toolbar_limits.setObjectName("权限")
        self.addToolBar(Qt.ToolBarArea.RightToolBarArea,self.toolbar_limits)
        
        self.action_group = self.toolbar_limits.addAction("用户组")
        
        # 添加分隔符
        self.toolbar_limits.addSeparator()

        self.action_single = self.toolbar_limits.addAction("个人权限")

    def center(self):
        """居中显示"""
        self.win_rect = self.frameGeometry()     #获取窗口矩形
        self.screen_center = self.screen().availableGeometry().center()      #屏幕中心
        self.win_rect.moveCenter(self.screen_center)      # 移动窗口矩形到屏幕中心
        self.move(self.win_rect.center)         # 移动窗口与窗口矩形重合


if __name__ == "__main__":
    app = QApplication(sys.argv)
    view = MainWindowView()
    view.show()
    sys.exit(app.exec())

结果:

二、对话框

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产之光Yakit——POC模拟神器

概要介绍Yakit 是一个高度集成化的 Yak 语言安全能力的安全测试平台,使用 Yakit,可以做到:类 Burpsuite 的 MITM 劫持操作台查看所有劫持到的请求的历史记录以及分析请求的参数全球第一个可视化的 Web 模糊测试工具:Web FuzzerYak…

前端项目-小米商城

首页的展示 首页的功能 1、搜索栏模糊查询 在我在输入框输入关键字的时候,会匹配关键字,如果我的存放的数据里面包含这些关机键字就会显示出来。做到模糊查询的效果。 2、实现搜索功能 在首页的搜索框点击搜索的时候,就会对你输入的关键字进…

VCSA证书过期处理

原创作者:运维工程师 谢晋 前提提要 客户环境为VSAN环境,VCSA版本为6.7,登陆VCSA时发现报错如下图:     经验判断该报错是因为VCSA的证书过期了,登陆VCSA的5480界面https://VCSAIP:5480,发现果然是证…

Java设计模式-建造者模式Builder

介绍 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以 将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方 法可以构造出不同表现(属性)的…

模拟实现list和vector反向迭代器

学习这部分知识,需要你了解vector和list的正向迭代器知识以及容器适配器知识,可以阅读我写的另外三篇vector、list、容器适配器 知识的博客!其中list知识内容尤其重要且难度要求很高! 反向迭代器,顾名思义是与正向迭代…

Mybatis整合Spring的事务控制与SqlSession线程安全问题

在Spring与Mybatis框架整合中,主要有两个重要改动,分别是事务与SqlSession。mybatis-spring包中为以上两个问题提供了解决方案。 重要组件 SpringManagedTransaction (Spring事务管理器)SqlSessionTemplate (SqlSess…

新年快到了,教大家用汇编语言显示Happy New Year!

新年快到了,教大家用汇编来显示Happy New Year! 文章目录新年快到了,教大家用汇编来显示Happy New Year!汇编老矣,尚能饭否?特点效率底层显示字符安装环境编写代码内存地址空间显示格式代码编译连接运行总结大家都知道&#xff0c…

使用Docker搭建主从数据库(MySQL)

很多人对主从数据库有一个误区,把多个MySQL搭建在同一个服务器上,性能提升是不是很有限?这个理念是错误的,数据库的性能瓶颈主要是在IO和CPU负载过高,在同一台服务器运行多个数据库,能带来更低的延迟&#…

Java中atomic包中的原子操作类总结

1. 原子操作类介绍 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量 i1,比如多个线程执行 i操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过 Synchronized 进行控制来达到线程安全的目…

【自学Python】Python复数(complex)

Python复数(complex) Python复数(complex)教程 Python 可以支持复数,复数的虚部用 j 或 J 来表示。如果需要在程序中对复数进行计算,需要导入 Python 的 cmath 模块,在该模块下包含了各种支持复数运算的函数。 案例 复数 定义 Python 中…

vim光速开发,你值得拥有

文章目录vim设计哲学vim的模式什么是可视模式光标移动动作(motion)操作符(operator)操作符(operator)动作(motion)实际使用大小写转换easymotionvim-surroundTIPSideavim的使用vim设计哲学 vim被称为编辑器之神。它的成名就是因为…

Python文档阅读笔记-Turn Images into Cartoons using Python

本博文说明如何将图片转为卡通风格。 1. 导入依赖模块 在编程的第一步首先要导入依赖库,在这个图像转换成卡通风格的程序中需要包含3个模块,分别是openCV,numpy,matpoltlib。 import cv2 import numpy as np import matplotlib.…

solidity Dapp 基于merkle的选择性披露合约——我的还是我的

现在生活中,大家为了隐私,并不希望直接将个人信息给别人看,比如我们去住酒店时,需要登记姓名、身份证号信息,但是如果我们直接把身份证给前台人员的话,前台人员就可以看到我们的民族、住址等信息。那么我们…

搭建我的世界java版服务器,公网远程联机【内网穿透】

文章目录1. 搭建我的世界服务器1.1 服务器安装java环境1.2 配置服务端2. 测试局域网联机3. 公网远程联机3.1 安装cpolar内网穿透3.1.1 windows系统3.1.2 linux系统(支持一键自动安装脚本)3.2 创建隧道映射内网端口3.3 测试公网远程联机4. 配置固定TCP端口…

利用mybatis对数据库中的数据进行增删改查操作

写在前面: 本篇文章的代码都是在上一篇文章的基础上增删改,本篇文章并不会出现所有的代码,如有需求可参考上篇文章传送门 namespace中的包名要和Dao/mapper接口的包名一致: 假设此时我们将接口名进行修改,而不改变映…

windows系统,计算机cmd管理员,命令行中普通用户获取管理员权限的命令

文章目录一、第一种方式:搜索框搜索二、第二种方式:winR (这种方式作者没有找到进入管理员的方式)三、普通方式进入,通过命令授予用户权限四、通过开始右键进入cmd参考文档一、第一种方式:搜索框搜索 以管理…

JLINK与 SWD接口

JLINK与 SWD接口 1.使用Jlink连接 Jlink驱动:SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace pylink文档:PyLink — PyLink 2.读取内存地址 3.获取内存地址的默认值 register.py 芯片配置: 环境搭建 1.按章Jlink 驱动…

搭建一个简单的负载均衡

前言: 负载均衡是互联网系统架构中必不可少的一个技术,通过负载均衡,可以将高并发的用户请求分发到多台应用服务器组成的一个服务器集群上,利用更多的服务器资源处理高并发下的计算压力。 早期负载均衡的实现,使用专…

[Linux]Linux调试器-gdb

🥁作者: 华丞臧. 📕​​​​专栏:【LINUX】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站 文…

HCIA实验(作业)

静态路由综合实验报告 实验目的 建立下图拓扑结构并满足下列要求: 除R5的环回地址固定以外,整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 R1–R4每个路由器存在两个环回接口,用于模拟连接PC网段,地址也在192.168.1.0…