引言:

https://github.com/0voice

Qt 提供了丰富的输入控件家族(Input Widgets),用于实现用户与程序的交互。这些控件覆盖了从简单的文本输入到复杂的日期时间选择等多种场景。下面结合你的代码,逐一介绍常用的输入控件:

1. QComboBox(下拉组合框)

功能定位:提供一个下拉列表,用户可以从中选择一个选项,也可配置为允许用户输入自定义内容。

核心特性

  • 支持添加、插入、删除选项
  • 可设置默认选中项
  • 提供索引变化、文本变化等信号
  • 支持图标与文本结合展示

代码示例解析

combobox1 = new QComboBox(this);
combobox1->setGeometry(10,10,100,39); // 设置位置和大小
combobox1->addItem("北京市");        // 添加选项
// ...添加更多选项
connect(combobox1, SIGNAL(currentIndexChanged(int)), 
        this, SLOT(comboboxIndex(int))); // 连接索引变化信号

常用方法

  • addItem(const QString &text):添加选项
  • currentText():获取当前选中的文本
  • currentIndex():获取当前选中项的索引
  • setEditable(bool editable):设置是否可编辑

2. QFontComboBox(字体选择组合框)

功能定位:QComboBox 的专用版本,专门用于字体选择,内置系统所有可用字体。

核心特性

  • 自动列出系统中安装的所有字体
  • 提供字体变化信号
  • 可过滤显示的字体类型

代码示例解析

fontcombobox = new QFontComboBox(this);
fontcombobox->setGeometry(100,20,100,39);
connect(fontcombobox, SIGNAL(currentFontChanged(QFont)), 
        this, SLOT(QFontComboBoxIndex(QFont)));

常用方法

  • currentFont():获取当前选中的字体
  • setFontFilters(FontFilters filters):设置字体过滤器
  • setWritingSystem(QFontDatabase::WritingSystem):按书写系统筛选

3. QLineEdit(单行文本编辑框)

功能定位:用于单行文本输入的控件,支持密码模式、输入验证等功能。

核心特性

  • 单行文本输入限制
  • 支持输入掩码(Input Mask)
  • 提供文本变化、编辑完成等信号
  • 支持回显模式(如密码模式)

代码示例解析

lineEdit = new QLineEdit(this);
lineEdit->setGeometry(200,100,200,30);
// 点击按钮获取输入内容
connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));

常用方法

  • text():获取输入的文本
  • setText(const QString &text):设置文本
  • clear():清空内容
  • setEchoMode(EchoMode mode):设置回显模式(如密码模式)
  • setValidator(QValidator *v):设置输入验证器

4. QPlainTextEdit(纯文本编辑框)

功能定位:用于多行纯文本编辑的控件,轻量级且高效,适合处理大量纯文本。

核心特性

  • 支持多行文本编辑
  • 可设置只读模式
  • 支持文本查找、替换
  • 内存占用比 QTextEdit 小

代码示例解析

plainTextEdit = new QPlainTextEdit(this);
plainTextEdit->setGeometry(450,400,400,500);
// 从文件加载文本
plainTextEdit->insertPlainText(strin.readAll());
// 设置只读模式
plainTextEdit->setReadOnly(true);

常用方法

  • plainText():获取纯文本内容
  • setPlainText(const QString &text):设置纯文本
  • insertPlainText(const QString &text):插入文本
  • setReadOnly(bool ro):设置只读模式

5. QTextEdit(富文本编辑框)

功能定位:支持富文本编辑的控件,可显示和编辑 HTML 格式的内容。

核心特性

  • 支持富文本(HTML)显示和编辑
  • 可插入图片、表格等元素
  • 支持文本格式设置
  • 提供撤销 / 重做功能

与 QPlainTextEdit 的区别

  • QPlainTextEdit:轻量级,纯文本,适合代码编辑、日志显示
  • QTextEdit:重量级,富文本,适合文档编辑、邮件撰写
6. QSpinBox(整数微调框)

功能定位:用于整数输入的控件,提供上下箭头调整数值。

核心特性

  • 可设置数值范围
  • 自定义步长
  • 支持前缀、后缀显示
  • 数值变化信号

代码示例解析

spinbox = new QSpinBox(this);
spinbox->setGeometry(300,200,300,60);
spinbox->setRange(0,100);       // 设置范围
spinbox->setSingleStep(10);     // 设置步长
spinbox->setValue(100);         // 设置初始值
spinbox->setSuffix("%不透明度"); // 设置后缀

常用方法

  • value():获取当前值
  • setValue(int val):设置值
  • setRange(int min, int max):设置范围
  • setSingleStep(int step):设置步长
  • setPrefix(const QString &prefix):设置前缀

同类控件

  • QDoubleSpinBox:用于浮点数输入

7. QDateTimeEdit 系列(日期时间编辑框)

包括QDateEditQTimeEditQDateTimeEdit三个控件,分别用于日期、时间、日期时间的输入。

功能定位:提供日期 / 时间的可视化输入控件,支持下拉日历选择。

核心特性

  • 可设置日期时间范围
  • 支持多种显示格式
  • 提供日期时间变化信号
  • 可通过箭头调整各部分数值

代码示例解析

#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QDateEdit>
#include <QTimeEdit>
#include <QDateTimeEdit>
#include <QPushButton>
#include <QDebug>
#include <QDate>
#include <QTime>
#include <QDateTime>

class DateTimeDemo : public QMainWindow {
    Q_OBJECT
public:
    DateTimeDemo(QWidget *parent = nullptr) : QMainWindow(parent) {
        // 设置主窗口标题和大小
        setWindowTitle("QDateEdit/QTimeEdit/QDateTimeEdit 示例");
        resize(500, 300);

        // 创建中心部件和主布局
        QWidget *centralWidget = new QWidget(this);
        QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
        setCentralWidget(centralWidget);

        // ========== 1. QDateEdit 示例 ==========
        QHBoxLayout *dateLayout = new QHBoxLayout();
        QLabel *dateLabel = new QLabel("日期选择:", this);
        QDateEdit *dateEdit = new QDateEdit(this);
        
        // 配置QDateEdit
        dateEdit->setDate(QDate::currentDate());  // 设置初始日期为当前日期
        dateEdit->setMinimumDate(QDate(2020, 1, 1));  // 设置最小日期
        dateEdit->setMaximumDate(QDate(2030, 12, 31));  // 设置最大日期
        dateEdit->setDisplayFormat("yyyy-MM-dd");  // 设置显示格式
        dateEdit->setCalendarPopup(true);  // 启用日历弹窗选择
        
        dateLayout->addWidget(dateLabel);
        dateLayout->addWidget(dateEdit);
        mainLayout->addLayout(dateLayout);

        // ========== 2. QTimeEdit 示例 ==========
        QHBoxLayout *timeLayout = new QHBoxLayout();
        QLabel *timeLabel = new QLabel("时间选择:", this);
        QTimeEdit *timeEdit = new QTimeEdit(this);
        
        // 配置QTimeEdit
        timeEdit->setTime(QTime::currentTime());  // 设置初始时间为当前时间
        timeEdit->setMinimumTime(QTime(8, 0, 0));  // 设置最小时间(8:00:00)
        timeEdit->setMaximumTime(QTime(20, 0, 0));  // 设置最大时间(20:00:00)
        timeEdit->setDisplayFormat("HH:mm:ss");  // 设置显示格式(24小时制)
        timeEdit->setSingleStep(15 * 60);  // 设置步长为15分钟(单位:秒)
        
        timeLayout->addWidget(timeLabel);
        timeLayout->addWidget(timeEdit);
        mainLayout->addLayout(timeLayout);

        // ========== 3. QDateTimeEdit 示例 ==========
        QHBoxLayout *dateTimeLayout = new QHBoxLayout();
        QLabel *dateTimeLabel = new QLabel("日期时间选择:", this);
        QDateTimeEdit *dateTimeEdit = new QDateTimeEdit(this);
        
        // 配置QDateTimeEdit
        dateTimeEdit->setDateTime(QDateTime::currentDateTime());  // 设置初始日期时间
        dateTimeEdit->setMinimumDateTime(QDateTime(QDate(2020, 1, 1), QTime(0, 0, 0)));  // 最小日期时间
        dateTimeEdit->setMaximumDateTime(QDateTime(QDate(2030, 12, 31), QTime(23, 59, 59)));  // 最大日期时间
        dateTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");  // 设置显示格式
        dateTimeEdit->setCalendarPopup(true);  // 启用日历弹窗
        
        dateTimeLayout->addWidget(dateTimeLabel);
        dateTimeLayout->addWidget(dateTimeEdit);
        mainLayout->addLayout(dateTimeLayout);

        // ========== 结果显示与按钮 ==========
        QPushButton *getButton = new QPushButton("获取选择的日期时间", this);
        QLabel *resultLabel = new QLabel("选择结果:", this);
        
        mainLayout->addWidget(getButton);
        mainLayout->addWidget(resultLabel);

        // 连接按钮点击信号
        connect(getButton, &QPushButton::clicked, this, [=]() {
            QString dateStr = dateEdit->date().toString("yyyy年MM月dd日");
            QString timeStr = timeEdit->time().toString("HH时mm分ss秒");
            QString dateTimeStr = dateTimeEdit->dateTime().toString("yyyy-MM-dd HH:mm:ss");
            
            resultLabel->setText(QString("选择结果:\n日期:%1\n时间:%2\n日期时间:%3")
                                 .arg(dateStr).arg(timeStr).arg(dateTimeStr));
            
            // 调试输出
            qDebug() << "选择的日期:" << dateEdit->date();
            qDebug() << "选择的时间:" << timeEdit->time();
            qDebug() << "选择的日期时间:" << dateTimeEdit->dateTime();
        });
    }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    DateTimeDemo w;
    w.show();
    return a.exec();
}

#include "main.moc"

常用方法

  • date()/time()/dateTime():获取当前值
  • setDate(QDate date):设置日期
  • setDisplayFormat(const QString &format):设置显示格式
  • setCalendarPopup(bool enable):启用日历弹窗

总结

Qt 的输入控件家族提供了全面的用户交互解决方案:

  1. 选择类控件QComboBox(通用选择)、QFontComboBox(字体选择)提供下拉选择功能
  2. 文本输入类QLineEdit(单行)、QPlainTextEdit(多行纯文本)、QTextEdit(富文本)满足不同文本输入需求
  3. 数值输入类QSpinBox/QDoubleSpinBox用于精确数值输入
  4. 日期时间类QDateTimeEdit系列专门处理日期时间输入

这些控件都继承自QWidget,支持信号与槽机制,可灵活定制外观和行为,是 Qt 界面开发中不可或缺的基础组件。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐