Qt控件---输入类

本文详细介绍了Qt库中常用的控件,如QLineEdit的文本验证、QTextEdit的多行输入和Markdown支持,以及QComboBox、QSpinBox/QDoubleSpinBox、QDateEdit/QTimeEdit/QDateTimeEdit的使用和设置。展示了如何通过旋钮(QDial)和滑动条(QSlider)控制透明度和窗口大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QLineEdit(单行输入)

属性说明
text输入框中的文本
inputMask输入内容格式约束
maxLength最大长度
frame是否添加边框
echoMode显示方式:QLineEdit::Normal:默认值,文本框会显示输入的文本;QLineEdit::Password:输入的字符会隐藏;QLineEdit::NoEcho:文本框不会显示任何字符
cursorPosition光标所在位置
alignment文字对齐方式
dragEnabled是否允许拖拽
readOnly是否是只读,不可修改
placeHolderText当输入框为空时显示的提示信息
clearButtonEnabled是否会自动显示清除按钮
信号说明
void cursorPositionChanged(int old, int new)鼠标移动时触发,old为之前的位置,new为现位置
void editingFinished()触发条件:按返回键、回车键;行编辑失去焦点
void returnPressed()按返回键、回车键时触发,如果设置了验证器需要通过验证才会触发
void selectionChanged()选中的文本改变时触发
void textChanged(const QString &text)当文本改变时触发,text是新的文本,代码形式修改文本也会触发
void textEdited(const QString &text))当文本改变时触发,text是新的文本,代码形式修改文本不会触发
QLineEdit *e1 = new QLineEdit(this);
QLineEdit *e2 = new QLineEdit(this);
QLineEdit *e3 = new QLineEdit(this);
QLabel *l = new QLabel(this);
QLabel *l1 = new QLabel(this);
QLabel *l2 = new QLabel(this);
QLabel *l3 = new QLabel(this);
QLabel *l4 = new QLabel(this);
QRadioButton *b1 = new QRadioButton(this);
QRadioButton *b2 = new QRadioButton(this);
QPushButton *b = new QPushButton(this);

// 设置控件
l->setGeometry(50, 150, 100, 100); l->setWordWrap(true);
l1->setText("姓名");
l2->setText("密码"); l2->move(0, 30);
l3->setText("性别"); l3->move(0, 60);
l4->setText("电话"); l4->move(0, 90);
e1->move(40, 0); e2->move(40, 30); e3->move(40, 90);
e2->setEchoMode(QLineEdit::Password);
b1->setText("男"); b2->setText("女");
b1->move(40, 60); b2->move(80, 60);
b->setText("确定"); b->move(50, 130);

// 点击确认后将信息显示到 l 控件中
connect(b, &QPushButton::clicked, this, [=](){
    // 获取性别
    QString gender = "";
    if(b1->isChecked()) gender = "男";
    if(b2->isChecked()) gender = "女";

    // 判空
    if(gender == "" || e1->text() == "" || e2->text() == "" || e3->text() == "")
    {
        l->setText("请输入全部信息");
        return;
    }

    // 显示
    QString ret = "";
    ret += "姓名:";
    ret += e1->text();
    ret += "\n密码:";
    ret += e2->text();
    ret += "\n性别:";
    ret += gender;
    ret += "\n电话:";
    ret += e3->text();
    l->setText(ret);
});

img

img

设置验证器

设置一个输入框只能输入数字,并且需要输入以1开头的11位数字下方的按钮才会启动点击

使用QRegExp创建一个正则表达式对象,使用QRegExpValidator创建一个验证器对象

QLineEdit *e = new QLineEdit(this);
QPushButton *b = new QPushButton(this);
b->move(0, 100); b->setText("确认"); b->setEnabled(false);

// 给 e 注册⼀个验证器
e->setValidator(new QRegExpValidator(QRegExp("^1\\d{10}$")));

// 设计输入框有文本输入时的槽
// 从而判定是否开启按钮
connect(e, &QLineEdit::textEdited, this, [=](const QString &arg1){
    QString content = arg1;
    int pos = 0;

    if (e->validator()->validate(content, pos) == QValidator::Acceptable)
        b->setEnabled(true);
    else
        b->setEnabled(false);
});

imgimg

可以看到明显的区别

QTextEdit(多行输入)

QTextEdit 表示多行输⼊框,也是⼀个富文本 & markdown 编辑器,并且能在内容超出编辑框范围时自动提供滚动条。

属性说明
markdown支持markdown格式,能自动对markdown文本进行渲染为html
html支持大部分html标签
placeHolderText输入框为空时的提示内容
readOnly是否只读
undoRedoEnable是否开启 undo、redo 功能;ctrl+Z—undo;ctrl+Y—redo
autoFormating开启自动格式化
tabstopWidth按下缩进占多少空间
overwriteMode是否开启覆盖写模式
acceptRichText是否接收富文本内容
verticalScrollBarPolicy垂直方向滚动条的出现策略:Qt::ScrollBarAsNeeded:默认值,根据内容自动决定是否需要滚动条;Qt::ScrollBarAlwaysOff:总是关闭滚动条;Qt::ScrollBarAlwaysOn:总是显示滚动条
horizontalScrollBarPolicy水平方向滚动条的出现策略:Qt::ScrollBarAsNeeded:默认值,根据内容自动决定是否需要滚动条;Qt::ScrollBarAlwaysOff:总是关闭滚动条;Qt::ScrollBarAlwaysOn:总是显示滚动条
信号说明
textChanged()文本内容改变时触发
selectionChanged()选中范围改变时触发
cursorPositionChanged()光标移动时出发
undoAvailable(bool)可以进行undo操作时触发
redoAvailable(bool)可以进行redo操作时触发
copyAvaiable(bool)文本被选中或者取消选中时触发

QComboBox(下拉框)

属性说明
currentText当前选中的文本
currentIndex当前选中的条目下标,没有选中条目则为-1
editable是否允许修改,也可以设置验证器
iconSize下拉框图标的大小
maxCount条目最大数
方法说明
addItem(const QString&)添加条目
currentIndex()获取当前选中的条目下标,没有选中条目则为-1
currentText()获取当前条目的文本内容
信号说明
activated(int) activated(const QString &text)当选择了⼀个选项时触发,这个时候相当于点开下拉框并且鼠标划过某个选项还没有确认做出选择
currentIndexChanged(int) currentIndexChanged(const QString &text)当前选项改变时触发,此时已经明确的选择了⼀个选项,用户操作或者通过程序操作都会触发这个信号
editTextChanged(const QString &text)当编辑框中的文本改变时发出,需要editable为true时才有效
QComboBox *e1 = new QComboBox(this);
QComboBox *e2 = new QComboBox(this);
QComboBox *e3 = new QComboBox(this);
QLabel *l = new QLabel(this);
QLabel *l1 = new QLabel(this);
QLabel *l2 = new QLabel(this);
QLabel *l3 = new QLabel(this);
QPushButton *b = new QPushButton(this);

// 设置控件
l->setGeometry(50, 100, 100, 100); l->setWordWrap(true);
l1->setText("主食");
l2->setText("水果"); l2->move(0, 30);
l3->setText("饮料"); l3->move(0, 60);
e1->move(40, 0); e2->move(40, 30); e3->move(40, 60);
b->setText("确定"); b->move(20, 90);

// 添加条目
e1->addItems(QStringList({"米饭", "面条"}));
e2->addItems(QStringList({"苹果", "西瓜", "香蕉"}));
e3->addItems(QStringList({"可乐", "雪碧"}));

// 点击确认后将信息显示到 l 控件中
connect(b, &QPushButton::clicked, this, [=](){
    QString ret = "";
    ret += "主食";
    ret += e1->currentText();
    ret += "\n水果:";
    ret += e2->currentText();
    ret += "\n饮料:";
    ret += e3->currentText();
    l->setText(ret);
});

img

通过读取文件设置条目

img

QComboBox *e = new QComboBox(this);

// 打开文件
std::ifstream file("d:/config.txt");
std::string line;
// 读取文件数据并设置条目
while (std::getline(file, line))
{
    // 注意要将C++原生的string转为QString类型
    e->addItem(QString::fromStdString(line));
}
file.close(); // 关闭文件

img

QSpinBox & QDoubleSpinBox(数字微调框)

QSpinBox 或者 QDoubleSpinBox 表示"微调框",它是带有按钮的输入框,可以用来输⼊整数/浮点数,通过点击按钮来修改数值大小。

属性说明
value存储数值
singleStep每次调整的步长
displayInteger数字的进制,设为10就是十进制,2就是二进制
minimum最小值
maximum最大值
suffix后缀
prefix前缀
wrapping是否允许换行
frame是否带边框
alignment文字对齐方式
readOnly是否允许修改
buttonSymbol按钮上的图标:UpDownArrows:上下箭头PlusMinus:加减号NoButtons:没有按钮
accelerated(加速)按下按钮时是否为快速调整模式
correctionMode输入有误时如何修正:QAbstractSpinBox::CorrectToPreviousValue:如果输入了无效值,则恢复成上一个有效值;QAbstractSpinBox::CorrectToNearestValue:如果输入了无效值,则恢复成离这个无效值最近的有效值
keyboardTrack是否开启键盘跟踪:设为true:每次在输入框输入一个数字,都会触发一次valueChanged() 和 textChanged() 信号;设为false:只有在最终按下 enter 或者输入框失去焦点才会触发valueChanged() 和 textChanged() 信号
信号说明
textChanged(QString)文本发生改变时会触发,参数 QString 带有 前缀 和 后缀
valueChanged(int)文本发生改变时会触发,参数 int 表示当前的数值
QComboBox *e1 = new QComboBox(this);
QComboBox *e2 = new QComboBox(this);
QComboBox *e3 = new QComboBox(this);
QSpinBox *s1 = new QSpinBox(this);
QSpinBox *s2 = new QSpinBox(this);
QSpinBox *s3 = new QSpinBox(this);
QLabel *l = new QLabel(this);
QLabel *l1 = new QLabel(this);
QLabel *l2 = new QLabel(this);
QLabel *l3 = new QLabel(this);
QPushButton *b = new QPushButton(this);

// 设置控件
s1->move(120, 0);s2->move(120, 30);s3->move(120, 60);
l->setGeometry(50, 100, 100, 100); l->setWordWrap(true);
l1->setText("主食");
l2->setText("水果"); l2->move(0, 30);
l3->setText("饮料"); l3->move(0, 60);
e1->move(40, 0); e2->move(40, 30); e3->move(40, 60);
b->setText("确定"); b->move(20, 90);

// 添加条目
e1->addItems(QStringList({"米饭", "面条"}));
e2->addItems(QStringList({"苹果", "西瓜", "香蕉"}));
e3->addItems(QStringList({"可乐", "雪碧"}));

// 点击确认后将信息显示到 l 控件中
connect(b, &QPushButton::clicked, this, [=](){
    QString ret = "";
    ret += "主食:";
    ret += e1->currentText() + " " + QString::number(s1->value());
    ret += "\n水果:";
    ret += e2->currentText() + " " + QString::number(s2->value());
    ret += "\n饮料:";
    ret += e3->currentText() + " " + QString::number(s3->value());
    l->setText(ret);
});

img

QDateEdit & QTimeEdit & QDateTimeEdit(日期微调框)

QDateEdit 作为日期的微调框

img

QTimeEdit 作为时间的微调框

img

QDateTimeEdit 作为日期和时间一起的微调框

img

以QDateTimeEdit为例:

属性说明
dateTime时间和日期的值,形如 2000/1/1 0:00:00
date单纯日期的值,形如 2001/1/1
time单纯时间的值,形如 0:00:00
displayFormat时间日期格式,形如 yyyy/M/d H:mm
minimumDateTime最小时间日期
maximumDateTime最大时间日期
timeSpecQt::LocalTime:显示本地时间Qt::UTC:显示协调世界时(UTC)Qt::OffsetFromUTC:显示相对于UTC的偏移量(时差)
信号说明
dateChanged(QDate)日期改变触发
timeChanged(QTime)时间改变触发
dateTimeChanged(QDateTime)时间日期任意一个改变时触发

时间计算器

QLabel *l = new QLabel(this); l->setGeometry(50, 100, 100, 100);
QDateTimeEdit *q1 = new QDateTimeEdit(this);
QDateTimeEdit *q2 = new QDateTimeEdit(this); q2->move(0, 30);
QPushButton *b = new QPushButton(this);
b->setText("计算"); b->move(20, 60);

connect(b, &QPushButton::clicked, this, [=](){
    QDateTime t1 = q1->dateTime();
    QDateTime t2 = q2->dateTime();

    int days = t1.daysTo(t2);
    int hours = (t1.secsTo(t2) / 3600) % 24;

    l->setText(QString::number(days) + "天;" +
               QString::number(hours) + "时。");
});

img

QDial(旋钮)

属性说明
value当前数值
minimum最小值
maximum最大值
singleStep按下方向键的时候改变的步长
pageStep按下 pageUp / pageDown 的时候改变的步长
sliderPosition界面上旋钮显示的初始位置
tracking外观是否会跟踪数值变化
wrapping是否允许循环调整,即值到最大时会回到最小
notchesVisible是否显示刻度线
notchTarget刻度线之间的相对位置,数字越大刻度线越稀疏
信号说明
valueChanged(int)数值改变时触发
rangeChanged(int, int)范围变化时触发

通过旋钮改变不透明度

QLabel *l = new QLabel(this); l->setGeometry(50, 100, 150, 100);
QDial *d = new QDial(this);
d->setWrapping(true); // 设置循环
d->setNotchesVisible(true); // 设置刻度可见
d->setMaximum(100); // 设置最大值
d->setMinimum(0); // 设置最小值
d->setValue(100); // 设置初始值

// 设置当旋钮值改变时的槽
connect(d, &QDial::valueChanged, this, [=](int value){
    l->setText(QString("当前不透明度为: ") + QString::number(value));
    this->setWindowOpacity((double)value / 100);
});

img

QSlider(滑动条)

属性说明
value当前数值
minimum最小值
maximum最大值
singleStep按下方向键的时候改变的步长
pageStep按下 pageUp / pageDown 的时候改变的步长
sliderPosition滑动条显示的初始位置
tracking外观是否会跟踪数值变化
orientation滑动条的方向是水平还是垂直
invertedAppearance是否要翻转滑动条的方向
tickPosition刻度的位置
tickInterval刻度的密集程度
信号说明
valueChanged(int)数值改变时触发
rangeChanged(int, int)范围变化时触发

通过滑动条改变窗口大小

QSlider *x = new QSlider(this); x->move(100, 100);
QSlider *y = new QSlider(this); y->move(100, 200);

// 设置滑动条
x->setMinimum(800); x->setMaximum(1200); // 设置边界
y->setMinimum(600); y->setMaximum(1000); // 设置边界
x->setSingleStep(50); y->setSingleStep(50); // 设置步长
x->setValue(800); y->setValue(600); // 设置初始值
x->setOrientation(Qt::Orientation::Horizontal); // 设置方向
y->setOrientation(Qt::Orientation::Vertical); // 设置方向
y->setInvertedAppearance(true); // 将y改成从上往下增⻓

// 分别设置滑动条数值改变的槽
connect(x, &QSlider::valueChanged, this, [=](int value){
    QRect rect = now->geometry();
    now->setGeometry(rect.x(), rect.y(), value, rect.height());
});
connect(y, &QSlider::valueChanged, this, [=](int value){
    QRect rect = now->geometry();
    now->setGeometry(rect.x(), rect.y(), rect.width(), value);
});

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CHJBL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值