pyside6(2):QMainWindow

1. 容器组件

容器组件用于承载所有可见的UI组件,容器组件就是运用运行时弹出的窗口,通常是QWindowQWidgetQDialog 类中的一种。关于三者的区别参见:QWidget,QMainWindow和QDialog的区别_Nothing-Anything-CSDN博客_qwidget和qdialog区别

如果是顶级对话框,一般基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。

2.QMainWindow

桌面软件主窗口一般由标题栏,菜单栏,工具栏,工作区和状态栏组成。

../../_images/mainwindowlayout.png

而工作区由各种各样的锚接控件组成,例如Pycharm的主窗口:

可以看到Pycharm的主窗口工作区默认有三个锚接控件,即文件浏览器、debug窗口和代码编辑器。QMainWindow提供了构建经典主窗口所需的组件以及相应的鼠标事件,用于简化应用主窗口的构建,QMainWindow常用设置有以下几种,更多参见:QMainWindow — Qt for Python

3.标题栏设置

class MyWidget(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # 设置标题
        self.setWindowTitle("QMainWindow示例")
        # 设置图标
        self.setWindowIcon(QPixmap(":/icon/ic_start"))

if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())

提示

代码中的QPixmap(":/icon/ic_start")参见pyside6(1):Qt 资源系统和qrc文件使用_anbuqi的博客-CSDN博客

4.菜单栏(QMenuBar)设置

4.1 菜单栏基本设置

QMainWindow默认添加了一个菜单栏可以通过self.menuBar()获取。向菜单栏添加菜单项

fileMenu = self.menuBar().addMenu(QPixmap(":/icon/ic_start"),"文件")

当参数中传入了一个图标对象时,默认只显示菜单项图标,不显示菜单项名称:

class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        # 菜单栏设置
        self.setupMenuBar()
    
     def setupMenuBar(self):
        # 添加文件菜单项
        fileMenu = self.menuBar().addMenu(QPixmap(":/icon/ic_start"),"文件")
        # 文件菜单项下的动作列表
        newAct = QAction(QPixmap(":/icon/ic_start"), "新建", self)
        fileMenu.addAction(newAct)

        saveAct = QAction(QPixmap(":/icon/ic_start"), "保存", self)
        fileMenu.addAction(saveAct)

        exitAct = QAction(QPixmap(":/icon/ic_start"), "退出", self)
        fileMenu.addAction(exitAct)
        
        # 自定义快捷键
        exitAct.setShortcut('Ctrl+Q')
        # 状态栏提示
        exitAct.setStatusTip('Exit application')
        # 利用信号槽机制,将退出动作和窗口的关闭函数联系起来
        exitAct.triggered.connect(self.close)

if __name__ == "__main__":
    ......

效果

 注意

创建QAction时,必须传入窗口对象self,否则QAction不会显示。

 4.2 自定义菜单栏

通过QMainWindowsetMenuWidget 可以实现自定义菜单栏:

class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupTitleBar()

        self.setupCustomMenuBar()
       
    def setupCustomMenuBar(self):
        menuBar = QWidget()
        layout = QGridLayout()
        fileBtn = QPushButton("文件")
        layout.addWidget(fileBtn, 0, 0)
        editBtn = QPushButton("编辑")
        layout.addWidget(editBtn, 0, 1)
        helpBtn = QPushButton("帮助")
        layout.addWidget(helpBtn, 0, 2)
        menuBar.setLayout(layout)
        self.setMenuWidget(menuBar)


if __name__ == "__main__":
    ......

 这样可以定制个性化的菜单栏,比如有道词典这种菜单栏:

5.状态栏设置(QStatusBar)

状态栏用于显示当前界面状态消息或者一些提示。状态栏可以显示以下三种消息:

  • 临时消息:用于解释工具提示文本或菜单条目。
  • 正常消息:占据状态栏的一部分,可能会被临时消息覆盖。例如,在文本编辑器中显示的页码和行号。
  • 永久消息:用于显示重要消息,例如代码编辑器中的语法错误提示。

QMaindow默认创建了一个QStatusBar,可以通过self.statusBar()获取。

5.1 显示临时消息

不会自动消失,直至被覆盖:

self.statusBar().showMessage("临时消息")

定时消失:

self.statusBar().showMessage("临时消息定时消失", 3000)

注意

临时消息之间是相互覆盖的关系,连续调用 showMessage只会显示最后设置的临时消息。例如:

        # 显示临时消息
        self.statusBar().showMessage("临时消息")
        # 显示临时消息,定时消失
        self.statusBar().showMessage("临时消息定时消失", 3000)

只会显示“临时消息定时消失” 这条消息。

5.2 显示正常消息

正常消息需要调用statusBaraddWidget方法添加:

normalMessage = QLabel("正常消息")
# 组件名称
normalMessage.setObjectName('normalMessage')
self.statusBar().addWidget(normalMessage)
btn = QPushButton("消息按钮")
# 组件名称
btn.setObjectName('btn')
self.statusBar().addWidget(btn)

 使用removeWidget移除正常消息: 

self.statusBar().removeWidget(self.statusBar().findChild(QLabel, 'normalMessage'))
self.statusBar().removeWidget(self.statusBar().findChild(QPushButton, 'normalBtn'))

5.3 显示永久消息

permanentMessage = QLabel("永久消息")
# 组件名称
permanentMessage.setObjectName('permanentMessage')
self.statusBar().addPermanentWidget(permanentMessage)

permanentBtn = QPushButton("永久消息按钮")
# 组件名称
permanentBtn.setObjectName('permanentBtn')
self.statusBar().addPermanentWidget(permanentBtn)

  永久消息也使用removeWidget移除。

(4)demo

import sys

from PySide6 import QtWidgets
from PySide6.QtGui import QPixmap, QAction
from PySide6.QtWidgets import QVBoxLayout, QMainWindow, QWidget, QGridLayout, QPushButton, QLabel

import res


class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        centerWidget = QWidget()
        mainLayout = QGridLayout()

        showTemMessageBtn = QPushButton("显示一般临时消息")
        showTemMessageBtn.clicked.connect(self.showTempMessage)
        mainLayout.addWidget(showTemMessageBtn, 0, 0)

        showTemMessageBtn2 = QPushButton("显示定时消失临时消息")
        showTemMessageBtn2.clicked.connect(self.showTimingTemMessage)
        mainLayout.addWidget(showTemMessageBtn2, 0, 1)

        showNormalMessageBtn = QPushButton("显示正常消息")
        showNormalMessageBtn.clicked.connect(self.showNormalMessage)
        mainLayout.addWidget(showNormalMessageBtn, 0, 2)

        shoPermanentBtn = QPushButton("显示永久消息")
        shoPermanentBtn.clicked.connect(self.showPermanentMessage)
        mainLayout.addWidget(shoPermanentBtn, 0, 3)

        clearNormalMessage = QPushButton("移除正常消息")
        clearNormalMessage.clicked.connect(self.removeNormalMessage)
        mainLayout.addWidget(clearNormalMessage, 1, 0)

        clearPermanentMessage = QPushButton("移除永久消息")
        clearPermanentMessage.clicked.connect(self.removePermanentMessage)
        mainLayout.addWidget(clearPermanentMessage, 1, 1)

        centerWidget.setLayout(mainLayout)
        self.setCentralWidget(centerWidget)

    def removeNormalMessage(self):
        self.statusBar().removeWidget(self.statusBar().findChild(QLabel, 'normalMessage'))
        self.statusBar().removeWidget(self.statusBar().findChild(QPushButton, 'normalBtn'))

    def removePermanentMessage(self):
        self.statusBar().removeWidget(self.statusBar().findChild(QLabel, 'permanentMessage'))
        self.statusBar().removeWidget(self.statusBar().findChild(QPushButton, 'permanentBtn'))

    def showTempMessage(self):
        self.statusBar().showMessage("临时消息")

    def showTimingTemMessage(self):
        self.statusBar().showMessage("临时消息定时消失", 1000)

    def showNormalMessage(self):
        normalMessage = QLabel("正常消息")
        # 组件名称
        normalMessage.setObjectName('normalMessage')
        self.statusBar().addWidget(normalMessage)
        btn = QPushButton("正常消息按钮")
        # 组件名称
        btn.setObjectName('normalBtn')
        self.statusBar().addWidget(btn)

    def showPermanentMessage(self):
        permanentMessage = QLabel("永久消息")
        # 组件名称
        permanentMessage.setObjectName('permanentMessage')
        self.statusBar().addPermanentWidget(permanentMessage)

        permanentBtn = QPushButton("永久消息按钮")
        # 组件名称
        permanentBtn.setObjectName('permanentBtn')
        self.statusBar().addPermanentWidget(permanentBtn)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())

6.可拖放停靠部件(QDockWidget)

dockWidget可以在围绕主窗口中央控件的四周区域停靠:

 停靠位置可选值由DockWidgetArea类定义,有四个停靠位置:上、下、左、右,可以一次选择多个值,例如:

import sys

from PySide6 import QtWidgets
from PySide6.QtGui import QPixmap, QAction, Qt
from PySide6.QtWidgets import QMainWindow, QWidget, QGridLayout, QPushButton, QLabel, QDockWidget
import sys

from PySide6 import QtWidgets
from PySide6.QtGui import QPixmap, QAction, Qt
from PySide6.QtWidgets import QMainWindow, QWidget, QGridLayout, QPushButton, QLabel, QDockWidget


class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        # 往主窗口添加停靠窗口
        dockWidget = QDockWidget("Dock Widget", self)
        # 设置可停靠位置为左和右
        dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea |
                                   Qt.RightDockWidgetArea)
       
        self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())


class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        # 往主窗口添加停靠窗口
        dockWidget = QDockWidget("Dock Widget", self)
        # 设置可停靠位置为左和右
        dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea |
                                   Qt.RightDockWidgetArea)
       
        self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())

 效果:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
课程亮点       本课程是PySide6零基础入门与项目实战视频教程,经过精心设计,分为十个章节,制作了141页ppt, 接近70个代码示例,主要讲解PySide6开发环境安装、基础控件与界面布局、项目实战,PySide6程序打包,安装包制作,安装卸载、更新,发布等知识。涵盖从基础概念到高级应用的全方位知识,旨在为你提供一条清晰、系统的学习之路。无论你是编程新手,还是希望深化对PySide6的了解,本课程都能满足你的需求。       教学环境:Win11 64bit、Python3.11、PyCharm、Anacoda。课程大纲第一章:基础篇 PySide6开发环境安装        从Anaconda环境配置开始,带你快速入门Win11/win10下PySide6、PyQt5开发环境的安装与配置,分别介绍PyCharm与VSCode如何配置PySide6,  以及Python AnaConda的基本用法,创建虚拟环境,安装python模块。第二章 控件与布局篇 PySide6常用控件与界面布局使用介绍        深入PySide6中的常用控件与界面布局技巧,通过丰富的实例,掌握PySide6的窗口、布局、控件等核心内容。主要介绍QLabel、QPushButton、QLineEdit、QCheckBox、QComboBox、QTextEdit、QTextBrowser、QListView与QListWidget、QStackedWidgetQTabWidgetQTableView等控件以及水平垂直布局,弹簧控件,栅格布局,表单布局。第三章 信号槽与事件机制       解锁PySide6的信号槽机制和事件处理技能,让你的应用更加灵活。详细介绍Qt自定义信号槽,跨窗口传递信号;Qt鼠标事件,键盘事件,组合事件,事件过滤。第四章 QMainWindow应用篇       详细介绍QMainWindow的使用,包括菜单栏、工具栏、状态栏和停靠窗口等。第五章 样式表qss与自定义控件        教你如何使用样式表美化应用界面,并创建独特的自定义控件。掌握这些技能后,学员将能够设计出既美观又功能丰富的用户界面。第六章 图表与曲线        引入pyqtgraph,展示如何在PySide6应用中绘制图表和动态曲线。第七章 数据库编程        带你进入数据库编程世界,使用sqlite3与PySide6结合,进行数据存储和管理。第八章 项目实战:高仿有道词典        通过一个高仿有道词典的项目,将所学知识融会贯通,实战演练。课程中将会接入翻译接口,开发一个属于自己的翻译软件。第九章 打包与部署       教你如何将PySide6项目打包成exe,并使用Inno Setup制作安装包,介绍软件更新、卸载策略,让你的应用轻松上线。第十章 课程总结        回顾整个课程的学习内容,巩固知识点,为进一步的学习和应用打下坚实的基础。教学特色       实战案例:每个章节都配备实战案例,让学习者在实践中深化理解。       代码资料全覆盖:提供全套课程代码资料下载,便于学习者随时查阅和复习。       高效学习路径:课程内容结构清晰,由浅入深,适合不同层次的学习者。       本课程提供全部代码与在线答疑。谁应该学习这个课程       对图形界面开发感兴趣的编程新手。       希望提升个人技能,进入或者深耕在GUI开发领域的开发者。       需要快速掌握PySide6进行项目开发的软件工程师。结语        通过本课程的学习,你不仅能掌握PySide6的核心技能,还能通过实战项目提升解决实际问题的能力,最终让你能独立完成专业的GUI应用开发。随着技术的深入,你将发现PySide6不仅仅是一个工具库,它开启的是一扇通往高效、美观应用开发的大门。        开始PySide6的学习之旅,让你的编程之路更加精彩!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安布奇

喜欢的朋友给点支持和鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值