4. PySide6 控件

窗口置顶

import sys

from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QWidget

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = QWidget()
    window.setWindowFlags(Qt.WindowStaysOnTopHint)
    window.show()
    sys.exit(app.exec())

QButtonGroup

在 Qt Designer 中,选择多个 RadioButton 对象右键,选择分配给按钮组,新建按钮组即可创建一个 QButtonGroup

QToolBar

在 Qt Designer 中,在窗口内右键,选择 添加工具栏,即可创建一个 QToolBar。为了给 QToolBar 添加工具,可以在动作编辑器中拖拽动作到工具栏中。

使用 InputMask 设置字符掩码

QLineEdit 有一个属性是 InputMask,可以使用 setInputMask 进行设置,目的是设置字符掩码,限制用户输入的内容必须符合掩码。[1]

下面是 Qt6 规范:

掩码字符含义
A只能是字母且必须,取值为 [a-zA-Z]
a同上但不是必须的
N字母或数字 [0-9a-zA-Z]
n同上但不是必须的
X任何字符
x同上但不是必须的
9数字 [0-9]
0同上但不是必须的
D数字 [1-9]
d同上但不是必须的
#数字或加减号 [0-9+-],不是必须的
H十六进制字符 [0-9a-fA-F]
h同上但不是必须的
B二进制字符 [01]
b同上但不是必须的

还可以使用元字符用于增强规则:

元字符含义
>所有字符都被转换为大写
<所有字符都被转换为小写
!关闭大小写转换
;c终止掩码规则并将空字符设置为 c
[ ] { }保留内容
\转义上述掩码字符或元字符

总结:

  • 掩码字符中,大写为必须输入,小写为可选
  • 元字符可以混合使用以便控制输入方式
实例含义
000.000.000.000;_IP 地址,_ 表示空白
HH:HH:HH:HH:HH:HH;_MAC 地址
0000-00-00ISO 日期,空白为空格 ' '
>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#许可证号码,大写,空白为 #

如果我需要设计一个输入 4 字节十六进制数字的输入框,可以使用 >HH-HH-HH-HH;_ 来表示。

创建文件浏览器

可以参考 QFileSystemModel在新窗口打开 来了解详细信息。

import os
import sys

from PySide6.QtCore import QDir, QModelIndex
from PySide6.QtGui import QStandardItem, QStandardItemModel
from PySide6.QtWidgets import (
    QApplication,
    QFileSystemModel,
    QHBoxLayout,
    QTreeView,
    QWidget,
)


class MainWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("文件浏览器")

        # 文件系统模型,只显示文件夹
        self._file_model = QFileSystemModel()
        self._file_model.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)  # type: ignore
        self._file_model.setRootPath("")

        # 创建目录树视图
        self._tree_view = QTreeView(self)
        self._tree_view.setModel(self._file_model)
        self._tree_view.setHeaderHidden(True)

        # 隐藏:文件大小、类型、修改时间
        for col in range(1, 4):
            self._tree_view.setColumnHidden(col, True)

        # 设置双击为展开文件到列表
        self._tree_view.doubleClicked.connect(self.flush_filelist)

        # 文件列表模型
        self._filelist_model = QStandardItemModel()

        # 创建文件列表视图
        self._filelist_view = QTreeView(self)
        self._filelist_view.setModel(self._filelist_model)
        self._filelist_view.setEditTriggers(QTreeView.NoEditTriggers)

        # 添加布局
        layout = QHBoxLayout()
        layout.addWidget(self._tree_view)
        layout.addWidget(self._filelist_view)
        self.setLayout(layout)

    def flush_filelist(self, index: QModelIndex):
        """刷新文件列表"""
        self._filelist_model.clear()
        path = self._file_model.filePath(index)
        # 设置列表头
        self._filelist_model.setHorizontalHeaderLabels([path])

        # 遍历文件夹下的文件
        for file in os.listdir(path):
            if os.path.isfile(os.path.join(path, file)):
                item = QStandardItem(file)
                self._filelist_model.appendRow(item)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWidget()
    window.resize(600, 400)
    window.show()
    sys.exit(app.exec())

简单浏览器

import sys

from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWidgets import QApplication, QMainWindow


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Web View")
        self._browser = QWebEngineView()
        self._browser.load("https://www.bing.com/")
        self.setCentralWidget(self._browser)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.showMaximized()
    app.exit(app.exec())

  1. QLineEdit,Qt6,https://doc.qt.io/qt-6/qlineedit.html#inputMask-prop在新窗口打开 ↩︎