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