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-00 | ISO 日期,空白为空格 ' ' |
>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())
QLineEdit,Qt6,https://doc.qt.io/qt-6/qlineedit.html#inputMask-prop ↩︎