Qt 输入控件 #
输入控件概览 #
text
┌─────────────────────────────────────────────────────────────┐
│ Qt 输入控件分类 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 数值输入: │
│ ├── QSpinBox - 整数输入框 │
│ ├── QDoubleSpinBox - 浮点数输入框 │
│ └── QSlider - 滑块 │
│ │
│ 选择输入: │
│ ├── QComboBox - 下拉选择框 │
│ ├── QFontComboBox - 字体选择框 │
│ └── QKeySequenceEdit - 快捷键编辑 │
│ │
│ 日期时间: │
│ ├── QDateEdit - 日期编辑 │
│ ├── QTimeEdit - 时间编辑 │
│ └── QDateTimeEdit - 日期时间编辑 │
│ │
│ 文本输入: │
│ ├── QLineEdit - 单行输入 │
│ ├── QTextEdit - 多行输入 │
│ └── QPlainTextEdit - 纯文本输入 │
│ │
└─────────────────────────────────────────────────────────────┘
QSpinBox 整数输入框 #
基本使用 #
cpp
QSpinBox *spinBox = new QSpinBox(this);
// 设置范围
spinBox->setRange(0, 100);
spinBox->setMinimum(0);
spinBox->setMaximum(100);
// 设置当前值
spinBox->setValue(50);
// 获取当前值
int value = spinBox->value();
// 设置步长
spinBox->setSingleStep(1); // 单步
spinBox->setPageStep(10); // 页步(Page Up/Down)
// 设置前缀和后缀
spinBox->setPrefix("$ ");
spinBox->setSuffix(" units");
// 设置特殊值文本
spinBox->setSpecialValueText("Auto"); // 最小值时显示
// 设置显示进制
spinBox->setDisplayIntegerBase(16); // 十六进制显示
spinBox->setDisplayIntegerBase(2); // 二进制显示
// 设置对齐
spinBox->setAlignment(Qt::AlignCenter);
信号处理 #
cpp
// 值改变信号
connect(spinBox, QOverload<int>::of(&QSpinBox::valueChanged), [](int value) {
qDebug() << "Value changed:" << value;
});
// 文本改变信号
connect(spinBox, &QSpinBox::textChanged, [](const QString &text) {
qDebug() << "Text changed:" << text;
});
// 编辑完成信号
connect(spinBox, &QSpinBox::editingFinished, []() {
qDebug() << "Editing finished";
});
自定义格式 #
cpp
// 重写 textFromValue 和 valueFromText
class HexSpinBox : public QSpinBox
{
public:
HexSpinBox(QWidget *parent = nullptr) : QSpinBox(parent)
{
setRange(0, 255);
setDisplayIntegerBase(16);
}
protected:
QString textFromValue(int value) const override
{
return QString("0x%1").arg(value, 2, 16, QChar('0')).toUpper();
}
int valueFromText(const QString &text) const override
{
bool ok;
return text.toInt(&ok, 16);
}
};
QDoubleSpinBox 浮点数输入框 #
基本使用 #
cpp
QDoubleSpinBox *doubleSpinBox = new QDoubleSpinBox(this);
// 设置范围
doubleSpinBox->setRange(0.0, 1.0);
doubleSpinBox->setMinimum(0.0);
doubleSpinBox->setMaximum(1.0);
// 设置当前值
doubleSpinBox->setValue(0.5);
// 获取当前值
double value = doubleSpinBox->value();
// 设置小数位数
doubleSpinBox->setDecimals(2); // 两位小数
// 设置步长
doubleSpinBox->setSingleStep(0.1);
// 设置前缀和后缀
doubleSpinBox->setPrefix("$ ");
doubleSpinBox->setSuffix(" %");
// 设置特殊值文本
doubleSpinBox->setSpecialValueText("Unlimited");
QSlider 滑块 #
基本使用 #
cpp
// 创建滑块
QSlider *slider = new QSlider(Qt::Horizontal, this); // 水平
QSlider *vSlider = new QSlider(Qt::Vertical, this); // 垂直
// 设置范围
slider->setRange(0, 100);
slider->setMinimum(0);
slider->setMaximum(100);
// 设置当前值
slider->setValue(50);
// 获取当前值
int value = slider->value();
// 设置步长
slider->setSingleStep(1); // 单步
slider->setPageStep(10); // 页步
// 设置刻度
slider->setTickPosition(QSlider::NoTicks); // 无刻度
slider->setTickPosition(QSlider::TicksAbove); // 上方刻度
slider->setTickPosition(QSlider::TicksBelow); // 下方刻度
slider->setTickPosition(QSlider::TicksBothSides); // 双侧刻度
slider->setTickInterval(10); // 刻度间隔
// 设置反转
slider->setInvertedAppearance(true); // 反转方向
与标签联动 #
cpp
QSlider *slider = new QSlider(Qt::Horizontal);
QLabel *label = new QLabel("50");
slider->setRange(0, 100);
slider->setValue(50);
connect(slider, &QSlider::valueChanged, label, [label](int value) {
label->setText(QString::number(value));
});
// 水平布局
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(slider);
layout->addWidget(label);
QDial 旋钮 #
基本使用 #
cpp
QDial *dial = new QDial(this);
// 设置范围
dial->setRange(0, 100);
// 设置当前值
dial->setValue(50);
// 设置步长
dial->setSingleStep(1);
dial->setPageStep(10);
// 设置是否显示刻度
dial->setNotchesVisible(true);
// 设置刻度目标
dial->setNotchTarget(10.0);
// 设置是否可回绕
dial->setWrapping(true);
QComboBox 下拉选择框 #
基本使用 #
cpp
QComboBox *comboBox = new QComboBox(this);
// 添加项目
comboBox->addItem("Item 1");
comboBox->addItem("Item 2");
comboBox->addItem("Item 3");
// 添加带图标的项目
comboBox->addItem(QIcon(":/icon.png"), "Item with Icon");
// 批量添加
comboBox->addItems(QStringList() << "A" << "B" << "C");
// 插入项目
comboBox->insertItem(0, "First");
// 设置用户数据
comboBox->addItem("Display Text", QVariant(42)); // 附加数据
// 获取用户数据
QVariant data = comboBox->itemData(0);
// 设置当前选中
comboBox->setCurrentIndex(0);
comboBox->setCurrentText("Item 1");
// 获取当前选中
int index = comboBox->currentIndex();
QString text = comboBox->currentText();
QVariant data = comboBox->currentData();
// 删除项目
comboBox->removeItem(0);
// 清空
comboBox->clear();
可编辑模式 #
cpp
// 设置可编辑
comboBox->setEditable(true);
// 设置自动补全
comboBox->setCompleter(new QCompleter(comboBox->model()));
// 设置插入策略
comboBox->setInsertPolicy(QComboBox::NoInsert); // 不插入
comboBox->setInsertPolicy(QComboBox::InsertAtTop); // 插入到顶部
comboBox->setInsertPolicy(QComboBox::InsertAtCurrent); // 插入到当前位置
comboBox->setInsertPolicy(QComboBox::InsertAtBottom); // 插入到底部
comboBox->setInsertPolicy(QComboBox::InsertAlphabetically); // 按字母排序插入
// 设置重复项处理
comboBox->setDuplicatesEnabled(false); // 不允许重复
信号处理 #
cpp
// 索引改变
connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [](int index) {
qDebug() << "Index changed:" << index;
});
// 文本改变
connect(comboBox, &QComboBox::currentTextChanged, [](const QString &text) {
qDebug() << "Text changed:" << text;
});
// 激活(选择或回车)
connect(comboBox, QOverload<int>::of(&QComboBox::activated), [](int index) {
qDebug() << "Activated:" << index;
});
// 高亮改变
connect(comboBox, QOverload<int>::of(&QComboBox::highlighted), [](int index) {
qDebug() << "Highlighted:" << index;
});
QFontComboBox 字体选择框 #
基本使用 #
cpp
QFontComboBox *fontComboBox = new QFontComboBox(this);
// 设置当前字体
fontComboBox->setCurrentFont(QFont("Arial"));
// 获取当前字体
QFont font = fontComboBox->currentFont();
// 设置字体过滤器
fontComboBox->setFontFilters(QFontComboBox::AllFonts); // 所有字体
fontComboBox->setFontFilters(QFontComboBox::ScalableFonts); // 可缩放字体
fontComboBox->setFontFilters(QFontComboBox::NonScalableFonts); // 不可缩放字体
fontComboBox->setFontFilters(QFontComboBox::MonospacedFonts); // 等宽字体
fontComboBox->setFontFilters(QFontComboBox::ProportionalFonts); // 比例字体
// 信号
connect(fontComboBox, &QFontComboBox::currentFontChanged, [](const QFont &font) {
qDebug() << "Font changed:" << font.family();
});
QDateTimeEdit 日期时间编辑 #
基本使用 #
cpp
QDateTimeEdit *dateTimeEdit = new QDateTimeEdit(this);
// 设置日期时间
dateTimeEdit->setDateTime(QDateTime::currentDateTime());
dateTimeEdit->setDate(QDate::currentDate());
dateTimeEdit->setTime(QTime::currentTime());
// 获取日期时间
QDateTime dateTime = dateTimeEdit->dateTime();
QDate date = dateTimeEdit->date();
QTime time = dateTimeEdit->time();
// 设置范围
dateTimeEdit->setMinimumDateTime(QDateTime(QDate(2020, 1, 1)));
dateTimeEdit->setMaximumDateTime(QDateTime(QDate(2030, 12, 31)));
// 设置显示格式
dateTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
dateTimeEdit->setDisplayFormat("yyyy年MM月dd日");
dateTimeEdit->setDisplayFormat("HH:mm");
// 设置日历弹出
dateTimeEdit->setCalendarPopup(true);
// 设置时间段
dateTimeEdit->setTimeSpec(Qt::LocalTime); // 本地时间
dateTimeEdit->setTimeSpec(Qt::UTC); // UTC 时间
QDateEdit 和 QTimeEdit #
cpp
// 日期编辑
QDateEdit *dateEdit = new QDateEdit(this);
dateEdit->setDate(QDate::currentDate());
dateEdit->setDisplayFormat("yyyy-MM-dd");
dateEdit->setCalendarPopup(true);
// 时间编辑
QTimeEdit *timeEdit = new QTimeEdit(this);
timeEdit->setTime(QTime::currentTime());
timeEdit->setDisplayFormat("HH:mm:ss");
信号处理 #
cpp
// 日期时间改变
connect(dateTimeEdit, &QDateTimeEdit::dateTimeChanged, [](const QDateTime &dateTime) {
qDebug() << "DateTime changed:" << dateTime.toString();
});
// 日期改变
connect(dateTimeEdit, &QDateTimeEdit::dateChanged, [](const QDate &date) {
qDebug() << "Date changed:" << date.toString();
});
// 时间改变
connect(dateTimeEdit, &QDateTimeEdit::timeChanged, [](const QTime &time) {
qDebug() << "Time changed:" << time.toString();
});
QKeySequenceEdit 快捷键编辑 #
基本使用 #
cpp
QKeySequenceEdit *keyEdit = new QKeySequenceEdit(this);
// 设置快捷键
keyEdit->setKeySequence(QKeySequence("Ctrl+S"));
// 获取快捷键
QKeySequence seq = keyEdit->keySequence();
QString seqStr = seq.toString();
// 清除
keyEdit->clear();
// 信号
connect(keyEdit, &QKeySequenceEdit::keySequenceChanged, [](const QKeySequence &seq) {
qDebug() << "Key sequence:" << seq.toString();
});
表单示例 #
cpp
QWidget *formWidget = new QWidget;
QFormLayout *layout = new QFormLayout(formWidget);
// 姓名
QLineEdit *nameEdit = new QLineEdit;
nameEdit->setPlaceholderText("Enter your name");
layout->addRow("Name:", nameEdit);
// 年龄
QSpinBox *ageSpinBox = new QSpinBox;
ageSpinBox->setRange(0, 150);
ageSpinBox->setValue(25);
layout->addRow("Age:", ageSpinBox);
// 性别
QComboBox *genderCombo = new QComboBox;
genderCombo->addItems({"Male", "Female", "Other"});
layout->addRow("Gender:", genderCombo);
// 生日
QDateEdit *birthdayEdit = new QDateEdit;
birthdayEdit->setCalendarPopup(true);
birthdayEdit->setDisplayFormat("yyyy-MM-dd");
layout->addRow("Birthday:", birthdayEdit);
// 评分
QSlider *ratingSlider = new QSlider(Qt::Horizontal);
ratingSlider->setRange(1, 10);
ratingSlider->setValue(5);
layout->addRow("Rating:", ratingSlider);
// 提交按钮
QPushButton *submitBtn = new QPushButton("Submit");
layout->addRow("", submitBtn);
formWidget->show();
下一步 #
现在你已经掌握了输入控件,接下来学习 信号与槽,深入理解 Qt 的核心通信机制!
最后更新:2026-03-29