
另外 3 个文本扩展控件
承接上文
PySide6 扩展文本控件(一):QTextBrowser、QLCDNumber
,本文介绍另外 3 个文本扩展控件。
QKeySequenceEdit、QFontComboBox 两个控件本身并不能处理文本,属于文本操作中需要的辅助控件。
QKeySequenceEdit:不处理文字内容;它捕获按键快捷键,绑定到文本编辑器动作(复制、粘贴、加粗、保存)QFontComboBox:用于选择字体,支持设置字体、字体大小、字体样式等
QGraphicsTextItem 内部直接复用 QTextDocument,和 QTextEdit 是同一套富文本渲染内核;支持 HTML、段落、文字选中、文本编辑等功能,但只能跑在 GraphicsView 画布坐标系里,可以旋转缩放。
QKeySequenceEdit
专门用来让用户录制快捷键(Ctrl+C、Alt+S 这类),捕获键盘序列,不是普通文字输入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QKeySequenceEdit, QPlainTextEdit, QLabel
import sys
class KeyShortcutDemo(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QKeySequenceEdit 快捷键录入")
self.resize(350, 150)
layout = QVBoxLayout(self)
self.ks_edit = QKeySequenceEdit()
self.edit_process = QPlainTextEdit("快捷键录入过程:")
self.lbl_final = QLabel("最终快捷键:")
self.ks_edit.keySequenceChanged.connect(self.on_key_changed)
self.ks_edit.editingFinished.connect(self.on_editing_finished)
layout.addWidget(self.ks_edit)
layout.addWidget(self.edit_process)
layout.addWidget(self.lbl_final)
def on_key_changed(self, ks):
self.edit_process.appendPlainText(ks.toString())
def on_editing_finished(self):
self.lbl_final.setText(f"录制完成,快捷键:{self.ks_edit.keySequence().toString()}")
app = QApplication(sys.argv)
window = KeyShortcutDemo()
window.show()
sys.exit(app.exec())
|
KeyShortcutDemo 控件中包含 QKeySequenceEdit、QPlainTextEdit、QLabel 三个控件:
QKeySequenceEdit 用于录入快捷键QPlainTextEdit 用于显示快捷键录入过程QLabel 用于显示最终快捷键
运行效果如下:

`keySequenceChanged 与 editingFinished 信号的区别:
- 参数
keySequenceChanged:最新的 QKeySequence 对象editingFinished:无参数,需要手动调用 .keySequence() 取值
- 触发时机
keySequenceChanged:序列一变化就触发editingFinished:一轮录制结束后,只触发一次
- 场景
keySequenceChanged:记录过程editingFinished:保存最终结果
QFontComboBox
内置系统字体列表,属于特殊文本相关控件,选中即触发字体变化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QFontComboBox, QLabel
class FontDemo(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QFontComboBox 字体选择")
self.resize(350, 120)
layout = QVBoxLayout(self)
font_cb = QFontComboBox()
self.tip = QLabel("当前字体:默认")
font_cb.currentFontChanged.connect(self.on_font_changed)
layout.addWidget(font_cb)
layout.addWidget(self.tip)
def on_font_changed(self, font):
self.tip.setFont(font)
self.tip.setText(f"当前字体:{font.family()}")
app = QApplication(sys.argv)
window = FontDemo()
window.show()
sys.exit(app.exec())
|
选择字体后,文本框以该字段显示字体名称,主要方法如下:
- currentFontChanged(QFont):选择字体时触发,参数是 QFont
- font.family():取字体族名
运行效果如下:


QGraphicsTextItem
QGraphicsTextItem 属于 GraphicsView(QtGraphics)体系,不是普通窗口控件 QWidget。在 QGraphicsScene 里的富文本图元,可缩放、旋转、移动。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| import sys
from PySide6.QtWidgets import (
QApplication, QGraphicsView, QGraphicsScene, QGraphicsTextItem
)
class GraphicsTextDemo(QGraphicsView):
def __init__(self):
super().__init__()
self.setWindowTitle("QGraphicsTextItem 画布文字")
self.resize(500, 300)
scene = QGraphicsScene(self)
text_item = QGraphicsTextItem("<h2>静夜思</h2><p>床前明月光</p>")
text_item.setPos(50, 50)
text_item.setRotation(15)
text_item.setScale(1.5)
scene.addItem(text_item)
self.setScene(scene)
app = QApplication(sys.argv)
window = GraphicsTextDemo()
window.show()
sys.exit(app.exec())
|
setPos:设置文本位置setRotation:设置文本角度setScale:设置文本缩放比例
运行效果如下:

小结
QKeySequenceEdit、QFontComboBox、QGraphicsTextItem 3 个控件是“文本生态”的一员,或控制或另一种形式的文本展示,搭配核心的文本控件以满足不同的需求。