IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> pyside6(2):QMainWindow -> 正文阅读

[开发工具]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())

?效果:

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 17:06:00  更:2021-10-01 17:08:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/23 9:37:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计