PySide6 提供了丰富的控件来满足不同的交互需求。由于控件的种类比较多,我们不能再一篇文章进行介绍,我把它分成3个部分,今天主要介绍输入类控件。
输入控件
PySide中具有输入功能的控件是超级多的,我列了一个表可以快速了解有哪些控件具有输入功能,以及其输入功能的一些细节。
|
控件名称 |
主要用途 |
输入类型 |
典型应用场景 |
|
QLineEdit |
单行文本输入 |
文本 |
用户名、搜索框、短文本输入 |
|
QTextEdit |
多行富文本输入 |
多行文本(支持格式) |
邮件正文、文档编辑、长备注 |
|
QPlainTextEdit |
多行纯文本输入 |
多行文本(纯文本) |
代码编辑器、日志显示、纯文本笔记 |
|
QSpinBox |
整数输入 |
数值(整数) |
年龄、数量、次数等整数设置 |
|
QDoubleSpinBox |
浮点数输入 |
数值(浮点数) |
价格、温度、百分比等带小数点的数值 |
|
QComboBox |
下拉选择 |
预定义选项 |
国家/地区选择、类别选择、枚举值 |
|
QCheckBox |
复选框(多选) |
布尔值或多项选择 |
选项开关、多选设置(如“记住密码”) |
|
QRadioButton |
单选按钮(互斥选择) |
枚举值(多选一) |
性别选择、模式切换(如“低/中/高”) |
|
QSlider |
滑块调节 |
数值(连续或离散) |
音量控制、亮度调节、范围选择 |
|
QInputDialog |
快速输入对话框 |
多种类型(文本、数字、选项) |
快速获取用户单项输入,如重命名、设置值 |
文本输入控件
这类控件用于处理各种文本输入。
- QLineEdit:单行文本输入框

QLineEdit 例程
这是最基础的文本输入控件,适合输入简短内容。你可以通过 text()方法获取输入内容,通过 setText()设置内容。它支持一些实用属性:
- setPlaceholderText(“请输入用户名”):设置占位符文本,提示用户该输入什么。
- setEchoMode(QLineEdit.Password):设置回显模式,常用于密码输入,用星号隐藏内容。
- 通过 setValidator()方法设置验证器,可以限制输入格式,例如只允许输入数字。
QLineEdit例程:
import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit
class SimpleLineEditDemo(QWidget):
def __init__(self):
super().__init__()
self.line_edit = None
self.label = None
self.initUI()
def initUI(self):
# 设置窗口属性
self.setWindowTitle('QLineEdit 简单示例')
self.setGeometry(300, 300, 400, 150) # (x, y, width, height)
# 创建布局
layout = QVBoxLayout()
# 创建标签用于显示输入内容
self.label = QLabel('您输入的内容将显示在这里...')
layout.addWidget(self.label)
# 创建 QLineEdit 输入框
self.line_edit = QLineEdit()
self.line_edit.setPlaceholderText("请输入一些文字...") # 设置占位符文本
layout.addWidget(self.line_edit)
# 连接信号:当文本改变时实时更新标签
self.line_edit.textChanged.connect(self.update_label)
# 设置布局
self.setLayout(layout)
def update_label(self, text):
"""槽函数:更新标签显示内容"""
if text:
self.label.setText(f"您输入的是:{text}")
else:
self.label.setText('您输入的内容将显示在这里...')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = SimpleLineEditDemo()
window.show()
sys.exit(app.exec())
这个例子运行当你在输入框中键入任何内容时,上方的标签会实时更新,显示你输入的内容。删除所有文字后,标签会恢复初始提示状态。
- QTextEdit 与 QPlainTextEdit:多行文本输入
当需要输入大段文字时,就需要使用多行文本控件。

QTextEdit 例程
- QTextEdit 功能强劲,支持富文本(如粗体、斜体)和 HTML 格式,适合需要文本格式化的场景,如邮件正文编辑。使用 toHtml()获取带格式的文本。
- QPlainTextEdit 更轻量,专注于处理纯文本,性能优于 QTextEdit,特别适合显示和编辑大段无格式文本,如日志或代码编辑器。使用 toPlainText()获取纯文本内容。
import sys
from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout,
QHBoxLayout, QTextEdit, QPlainTextEdit, QLabel)
class TextEditDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QTextEdit 与 QPlainTextEdit 示例')
self.resize(600, 400)
# 创建主布局
main_layout = QVBoxLayout()
# 创建 QTextEdit 部分
rich_text_label = QLabel("QTextEdit (富文本支持):")
self.rich_text_edit = QTextEdit()
# 设置初始富文本内容
initial_html = """
<h1>这是一个标题</h1>
<p>这是<strong>加粗</strong>文本和<em>斜体</em>文本。</p>
<phljs-symbol">color:blue;">这是蓝色文字。</p>
<ul>
<li>列表项 1</li>
<li>列表项 2</li>
</ul>
"""
self.rich_text_edit.setHtml(initial_html)
# 创建 QPlainTextEdit 部分
plain_text_label = QLabel("QPlainTextEdit (纯文本, 高效):")
self.plain_text_edit = QPlainTextEdit()
# 设置初始纯文本内容
self.plain_text_edit.setPlainText(
"这是一个纯文本编辑器。
它超级适合显示日志、代码或任何大量文本。
性能优于QTextEdit。")
# 将控件添加到布局
main_layout.addWidget(rich_text_label)
main_layout.addWidget(self.rich_text_edit)
main_layout.addWidget(plain_text_label)
main_layout.addWidget(self.plain_text_edit)
self.setLayout(main_layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = TextEditDemo()
window.show()
sys.exit(app.exec())
数值输入控件
当输入内容限定为数字时,使用专门的数值控件能提供更好的用户体验。
- QSpinBox :数字微调框
它们带有一个上下箭头按钮,可以微调数值。

QSpinBox 与 QDoubleSpinBox 例程
- QSpinBox 用于整数输入,QDoubleSpinBox用于浮点数输入。
- 通过 setRange(min, max)设置取值范围,setValue()设置当前值,value()获取当前值。
- 对于 QDoubleSpinBox,还可以用 setDecimals()设置小数点后的位数。
import sys
from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,
QSpinBox, QDoubleSpinBox, QLabel, QFormLayout,
QGroupBox, QPushButton)
class SpinBoxDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QSpinBox 和 QDoubleSpinBox 示例')
self.resize(400, 300)
# 创建主布局
main_layout = QVBoxLayout()
# 创建整数微调框组
int_group = QGroupBox("整数微调框 (QSpinBox)")
int_layout = QFormLayout()
self.int_spinbox = QSpinBox()
self.int_spinbox.setRange(0, 100) # 设置范围 0-100
self.int_spinbox.setValue(50) # 设置初始值
self.int_spinbox.setSingleStep(5) # 设置步长为5
self.int_spinbox.setPrefix("数量: ") # 设置前缀
self.int_spinbox.setSuffix(" 个") # 设置后缀
self.int_spinbox.valueChanged.connect(self.on_int_value_changed)
self.int_label = QLabel("当前值: 50")
int_layout.addRow("整数调节:", self.int_spinbox)
int_layout.addRow(self.int_label)
int_group.setLayout(int_layout)
# 创建浮点数微调框组
double_group = QGroupBox("浮点数微调框 (QDoubleSpinBox)")
double_layout = QFormLayout()
self.double_spinbox = QDoubleSpinBox()
self.double_spinbox.setRange(0.0, 100.0) # 设置范围 0.0-100.0
self.double_spinbox.setValue(25.5) # 设置初始值
self.double_spinbox.setSingleStep(0.5) # 设置步长为0.5
self.double_spinbox.setDecimals(2) # 设置小数位数为2
self.double_spinbox.setPrefix("价格: ¥") # 设置前缀
self.double_spinbox.setSuffix(" 元") # 设置后缀
self.double_spinbox.valueChanged.connect(self.on_double_value_changed)
self.double_label = QLabel("当前值: 25.50")
double_layout.addRow("浮点数调节:", self.double_spinbox)
double_layout.addRow(self.double_label)
double_group.setLayout(double_layout)
# 创建功能按钮
button_layout = QHBoxLayout()
self.read_btn = QPushButton("读取当前值")
self.read_btn.clicked.connect(self.read_current_values)
self.reset_btn = QPushButton("重置")
self.reset_btn.clicked.connect(self.reset_values)
button_layout.addWidget(self.read_btn)
button_layout.addWidget(self.reset_btn)
# 结果标签
self.result_label = QLabel("在这里查看操作结果...")
self.result_label.setStyleSheet("background-color: #f0f0f0; padding: 10px;")
# 将所有组件添加到主布局
main_layout.addWidget(int_group)
main_layout.addWidget(double_group)
main_layout.addLayout(button_layout)
main_layout.addWidget(self.result_label)
self.setLayout(main_layout)
def on_int_value_changed(self, value):
"""整数微调框值改变时的槽函数"""
self.int_label.setText(f"当前值: {value}")
self.result_label.setText(f"整数框值变为: {value}")
def on_double_value_changed(self, value):
"""浮点数微调框值改变时的槽函数"""
self.double_label.setText(f"当前值: {value:.2f}")
self.result_label.setText(f"浮点数框值变为: {value:.2f}")
def read_current_values(self):
"""读取当前值的槽函数"""
int_value = self.int_spinbox.value()
double_value = self.double_spinbox.value()
self.result_label.setText(f"当前值 - 整数: {int_value}, 浮点数: {double_value:.2f}")
def reset_values(self):
"""重置为默认值的槽函数"""
self.int_spinbox.setValue(50)
self.double_spinbox.setValue(25.5)
self.result_label.setText("已重置为默认值")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = SpinBoxDemo()
window.show()
sys.exit(app.exec())
- QSlider:滑块
通过拖动滑块来直观地调整一个范围内的数值。可以使用 setOrientation(1)设置水平或垂直方向。valueChanged信号在滑块值改变时触发,可用于实时响应。

QSlider 例程
import sys
from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout,
QHBoxLayout, QSlider, QLabel, QPushButton)
from PySide6.QtCore import Qt
class SliderDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QSlider 滑动条示例')
self.resize(400, 300)
# 创建主布局
main_layout = QVBoxLayout()
# 创建水平滑动条部分
h_layout = QHBoxLayout()
self.h_label = QLabel('水平滑块值: 50')
self.h_slider = QSlider(Qt.Horizontal)
# 设置水平滑动条属性
self.h_slider.setMinimum(0) # 最小值
self.h_slider.setMaximum(100) # 最大值
self.h_slider.setValue(50) # 初始值
self.h_slider.setSingleStep(5) # 单步步长
self.h_slider.setTickPosition(QSlider.TicksBelow) # 刻度位置
self.h_slider.setTickInterval(10) # 刻度间隔
h_layout.addWidget(QLabel('水平滑块:'))
h_layout.addWidget(self.h_slider)
h_layout.addWidget(self.h_label)
# 创建垂直滑动条部分
v_layout = QHBoxLayout()
self.v_label = QLabel('垂直滑块值: 30')
self.v_slider = QSlider(Qt.Vertical)
# 设置垂直滑动条属性
self.v_slider.setMinimum(0)
self.v_slider.setMaximum(60)
self.v_slider.setValue(30)
self.v_slider.setSingleStep(2)
self.v_slider.setTickPosition(QSlider.TicksLeft)
self.v_slider.setTickInterval(5)
v_layout.addWidget(QLabel('垂直滑块:'))
v_layout.addWidget(self.v_slider)
v_layout.addWidget(self.v_label)
# 创建功能按钮
btn_layout = QHBoxLayout()
self.read_btn = QPushButton('读取当前值')
self.reset_btn = QPushButton('重置滑块')
btn_layout.addWidget(self.read_btn)
btn_layout.addWidget(self.reset_btn)
# 结果显示标签
self.result_label = QLabel('操作结果将显示在这里...')
self.result_label.setAlignment(Qt.AlignCenter)
self.result_label.setStyleSheet('background-color: #f0f0f0; padding: 10px; border: 1px solid #ccc;')
# 连接信号与槽
self.h_slider.valueChanged.connect(self.on_h_slider_changed)
self.v_slider.valueChanged.connect(self.on_v_slider_changed)
self.read_btn.clicked.connect(self.read_values)
self.reset_btn.clicked.connect(self.reset_sliders)
# 将所有组件添加到主布局
main_layout.addLayout(h_layout)
main_layout.addLayout(v_layout)
main_layout.addLayout(btn_layout)
main_layout.addWidget(self.result_label)
self.setLayout(main_layout)
def on_h_slider_changed(self, value):
"""水平滑动条值改变时的槽函数"""
self.h_label.setText(f'水平滑块值: {value}')
self.result_label.setText(f'水平滑块值变为: {value}')
def on_v_slider_changed(self, value):
"""垂直滑动条值改变时的槽函数"""
self.v_label.setText(f'垂直滑块值: {value}')
self.result_label.setText(f'垂直滑块值变为: {value}')
def read_values(self):
"""读取当前滑块值的槽函数"""
h_value = self.h_slider.value()
v_value = self.v_slider.value()
self.result_label.setText(f'当前值 - 水平: {h_value}, 垂直: {v_value}')
def reset_sliders(self):
"""重置滑块为默认值的槽函数"""
self.h_slider.setValue(50)
self.v_slider.setValue(30)
self.result_label.setText('滑块已重置为默认值')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = SliderDemo()
window.show()
sys.exit(app.exec())
选择控件
当输入内容来自一组预定义选项时,选择控件是理想选择。
- QComboBox:下拉列表框
点击后展开一个列表供用户选择。使用 addItem()或 addItems()添加选项。通过 currentText()获取当前选中的文本,currentIndex()获取索引。currentIndexChanged信号在选项变化时触发。

QComboBox 例程
import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QComboBox
class ComboBoxExample(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设置窗口属性
self.setWindowTitle('QComboBox 示例')
self.resize(300, 150)
# 创建主布局
layout = QVBoxLayout()
# 创建标签用于显示选择结果
self.result_label = QLabel('当前选择:请从下拉列表中选择')
layout.addWidget(self.result_label)
# 创建QComboBox
self.combo_box = QComboBox()
# 方法1:逐个添加选项
self.combo_box.addItem('Python')
self.combo_box.addItem('Java')
self.combo_box.addItem('C++')
# 方法2:批量添加选项列表
languages = ['JavaScript', 'Go', 'Rust', 'Swift']
self.combo_box.addItems(languages)
# 连接信号:当选择改变时触发
self.combo_box.currentIndexChanged.connect(self.on_selection_changed)
self.combo_box.currentTextChanged.connect(self.on_text_changed)
layout.addWidget(self.combo_box)
self.setLayout(layout)
def on_selection_changed(self, index):
"""当选择项索引改变时调用"""
selected_text = self.combo_box.currentText()
self.result_label.setText(f'选择索引: {index}, 内容: {selected_text}')
print(f'选项改变 - 索引: {index}, 文本: {selected_text}')
def on_text_changed(self, text):
"""当选择项文本改变时调用"""
print(f'文本改变为: {text}')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ComboBoxExample()
window.show()
sys.exit(app.exec())
- QCheckBox:复选框
用于表明一个独立的“是/否”选项或可以同时选择多个选项的情况。通过 isChecked()方法判断是否被勾选。stateChanged信号在状态改变时发出。

QCheckBox 例程
from PySide6.QtWidgets import QApplication, QCheckBox, QWidget, QVBoxLayout
class ExampleWindow(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout()
# 创建复选框并设置文本
self.checkbox = QCheckBox("启用高级选项")
# 设置初始状态为选中
self.checkbox.setChecked(True)
# 连接信号:当状态改变时触发自定义函数
self.checkbox.toggled.connect(self.on_checkbox_toggled)
layout.addWidget(self.checkbox)
self.setLayout(layout)
def on_checkbox_toggled(self, checked):
# 根据状态执行不同操作
if checked:
print("高级功能已开启")
# 这里可以添加启用相关功能的代码
else:
print("高级功能已关闭")
# 这里可以添加禁用相关功能的代码
if __name__ == "__main__":
app = QApplication([])
window = ExampleWindow()
window.show()
app.exec()
- QRadioButton:单选按钮
用于在一组选项中只能选择一个的互斥场景。需要将多个 QRadioButton放入同一个父组件(如 QGroupBox或 QWidget)中来实现互斥。通过 isChecked()判断哪个被选中。

QRadioButton 例程
import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QRadioButton, QLabel
class RadioButtonExample(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设置窗口
self.setWindowTitle('QRadioButton 简单示例')
self.resize(300, 200)
# 创建布局
layout = QVBoxLayout()
# 创建标签显示选择结果
self.result_label = QLabel('请选择一个选项')
layout.addWidget(self.result_label)
# 创建单选按钮
self.radio1 = QRadioButton('选项 A')
self.radio2 = QRadioButton('选项 B')
self.radio3 = QRadioButton('选项 C')
# 设置默认选中项
self.radio1.setChecked(True)
self.result_label.setText('当前选择: 选项 A')
# 将单选按钮添加到布局
layout.addWidget(self.radio1)
layout.addWidget(self.radio2)
layout.addWidget(self.radio3)
# 连接信号与槽
self.radio1.toggled.connect(lambda: self.on_radio_toggled('选项 A'))
self.radio2.toggled.connect(lambda: self.on_radio_toggled('选项 B'))
self.radio3.toggled.connect(lambda: self.on_radio_toggled('选项 C'))
self.setLayout(layout)
def on_radio_toggled(self, option_text):
"""处理单选按钮状态变化的槽函数"""
# 只有被选中的按钮才会触发这个函数
self.result_label.setText(f'当前选择: {option_text}')
print(f'用户选择了: {option_text}')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = RadioButtonExample()
window.show()
sys.exit(app.exec())
快速输入:QInputDialog
QInputDialog不是一个常驻界面的控件,而是一个便捷的对话框,用于快速获取用户的一项输入。它支持整数、浮点数、文本、多行文本和下拉选项等多种模式,超级适合进行简单的交互,如重命名文件或输入一个数值。

QInputDialog 例程
import sys
from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout,
QPushButton, QInputDialog, QLabel)
class SimpleInputDemo(QWidget):
def __init__(self):
super().__init__()
self.user_info = None
self.intro_btn = None
self.city_btn = None
self.height_btn = None
self.age_btn = None
self.name_btn = None
self.info_label = None
self.initUI()
def initUI(self):
self.setWindowTitle('QInputDialog 简单例程')
self.resize(300, 300)
layout = QVBoxLayout()
# 显示结果的标签
self.info_label = QLabel('请点击按钮输入信息')
self.info_label.setWordWrap(True) # 允许文本自动换行
layout.addWidget(self.info_label)
# 1. 获取文本 - 姓名
self.name_btn = QPushButton('输入姓名')
self.name_btn.clicked.connect(self.get_name)
layout.addWidget(self.name_btn)
# 2. 获取整数 - 年龄
self.age_btn = QPushButton('输入年龄')
self.age_btn.clicked.connect(self.get_age)
layout.addWidget(self.age_btn)
# 3. 获取浮点数 - 身高
self.height_btn = QPushButton('输入身高 (米)')
self.height_btn.clicked.connect(self.get_height)
layout.addWidget(self.height_btn)
# 4. 从列表选择 - 城市
self.city_btn = QPushButton('选择城市')
self.city_btn.clicked.connect(self.get_city)
layout.addWidget(self.city_btn)
# 5. 获取多行文本 - 简介
self.intro_btn = QPushButton('输入简介')
self.intro_btn.clicked.connect(self.get_intro)
layout.addWidget(self.intro_btn)
self.setLayout(layout)
# 存储用户信息
self.user_info = {
'name': '未输入',
'age': '未输入',
'height': '未输入',
'city': '未输入',
'intro': '未输入'
}
def get_name(self):
"""获取文本输入 - 姓名"""
text, ok = QInputDialog.getText(
self,
'输入姓名',
'请输入你的姓名:',
text='张三' # 可选初始值
)
if ok and text:
self.user_info['name'] = text
self.update_display()
def get_age(self):
"""获取整数输入 - 年龄"""
age, ok = QInputDialog.getInt(
self,
'输入年龄',
'请输入你的年龄:',
value=18, # 默认值
minValue=0, # 最小值
maxValue=120, # 最大值
step=1 # 步长
)
if ok:
self.user_info['age'] = str(age)
self.update_display()
def get_height(self):
"""获取浮点数输入 - 身高"""
height, ok = QInputDialog.getDouble(
self,
'输入身高',
'请输入你的身高 (米):',
value=1.75, # 默认值
minValue=0.5, # 最小值
maxValue=2.5, # 最大值
decimals=2 # 小数位数
)
if ok:
self.user_info['height'] = f"{height:.2f}"
self.update_display()
def get_city(self):
"""从列表中选择项目 - 城市"""
cities = ['北京', '上海', '广州', '深圳', '杭州', '成都']
city, ok = QInputDialog.getItem(
self,
'选择城市',
'请选择你所在的城市:',
cities,
current=0, # 默认选中第一项
editable=False # 不允许编辑,只能选择
)
if ok and city:
self.user_info['city'] = city
self.update_display()
def get_intro(self):
"""获取多行文本输入 - 简介"""
text, ok = QInputDialog.getMultiLineText(
self,
'输入简介',
'请简单介绍一下自己:',
text='这个人很懒,什么也没写...' # 可选初始文本
)
if ok and text:
# 简略显示,避免界面过长
display_text = text[:20] + '...' if len(text) > 20 else text
self.user_info['intro'] = display_text
self.update_display()
def update_display(self):
"""更新界面显示"""
info_text = "已收集的信息:nn"
info_text += f"姓名: {self.user_info['name']}n"
info_text += f"年龄: {self.user_info['age']}n"
info_text += f"身高: {self.user_info['height']} 米n"
info_text += f"城市: {self.user_info['city']}n"
info_text += f"简介: {self.user_info['intro']}"
self.info_label.setText(info_text)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = SimpleInputDemo()
window.show()
sys.exit(app.exec())
核心使用技巧
- 获取输入值:这是与控件交互的核心。记住常用方法:text()(QLineEdit)、value()(QSpinBox/QDoubleSpinBox)、currentText()(QComboBox)、isChecked()(QCheckBox/QRadioButton)。
- 响应输入变化:使用信号与槽机制。将控件的信号(如 textChanged、valueChanged、clicked)连接到你的自定义函数(槽),即可在用户操作时立即执行代码。
- 数据验证:确保输入数据的有效性。可以使用内置验证器(如 QIntValidator、QDoubleValidator),或在槽函数中进行逻辑判断,并通过 QMessageBox提示用户。
















暂无评论内容