Qt常用控件(三)

一、QLineEdit

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) 当QLineEdit中的文本改变时,发出此信号,text是新的文本。代码对文本的修改能够触发这个信号
void textEdited(const QString &text)) 当QLineEdit中的文本改变时,发出此信号,text是新的文本。代码对文本的修改不能触发这个信号

代码样例(录入个人信息):

首先,创建三个lineEdit,两个radioButton和一个pushButton

编写widget.cpp文件

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //首先先编辑第一个输入框
    ui->lineEdit_name->setPlaceholderText("请输入姓名");
    ui->lineEdit_name->setClearButtonEnabled(true);
    //编辑第二个输入框
    ui->lineEdit_password->setPlaceholderText("请输入密码");
    ui->lineEdit_password->setClearButtonEnabled(true);
    ui->lineEdit_password->setEchoMode(QLineEdit::Password);
    //编辑第三个输入框
    ui->lineEdit_phone->setPlaceholderText("请输入您的电话号码");
    ui->lineEdit_phone->setClearButtonEnabled(true);
    ui->lineEdit_phone->setInputMask("000_0000_0000");
}

Widget::~Widget()
{
    delete ui;
}

运行一下代码:

继续修改,添加按钮的槽函数:

运行代码:

inputMask 只能进行简单的输入格式校验.,实际开发中, 基于正则表达式的方式是更核心的方法

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串中字符组合的模式,它使用特殊的字符序列来描述字符串的规则,从而可以方便地进行字符串的查找、替换、验证等操作。

正则表达式文档

使用正则表达式样例:

首先先创建一个lineEdit和一个按钮

接着,编写widget.cpp文件

  • 创建 QRegExp 对象来定义正则表达式 "^1\d{10}$",该表达式表示"以数字1开头,后接任意10位数字"的格式。
  • 通过 QRegExpValidator 创建验证器对象。Qt 框架内置提供了四种主要类型的验证器。
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

#include <QRegExpValidator>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置按钮默认是禁用状态
    ui->pushButton->setEnabled(false);
    //给lineEdit注册一个validator
    ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^1\\d{10}$")));
}

Widget::~Widget()
{
    delete ui;
}

编写 widget.cpp, 给 lineEdit 添加 textEdited 信号的 slot 函数

cpp 复制代码
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
    qDebug() << arg1;

    QString content = arg1;
    int pos = 0;
    /*通过 validate ⽅法验证⽂本是否符合要求
      第⼀个参数填写的是要验证的字符串. 由于参数要求是 QString& ⽽不是 const
      QString& , 需要把这个变量复制⼀下
      第⼆个参数是⼀个 int&, 是输出型参数. 当验证的字符串不匹配时, 返回这个字符串的⻓度. (没有
      啥实质作⽤)
      返回值是⼀个枚举. QValidator::Acceptable 表⽰验证通过,QValidator::Invalid 表⽰验证不通过*/
    if(ui->lineEdit->validator()->validate(content, pos) == QValidator::Acceptable)
    {
        //验证通过设置按钮为可用状态
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton->setEnabled(false);
    }
}

运行结果:

代码样例(验证两次输入的密码一致):

首先,在界面上创建两个输入框和⼀个 label

编写widget.cpp文件

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->lineEdit->setEchoMode(QLineEdit::Password);
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);
}

设置槽函数

cpp 复制代码
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
    (void)arg1;
    const QString& s1 = ui->lineEdit->text();
    const QString& s2 = ui->lineEdit_2->text();
    //进行判断
    if(s1.isEmpty() && s2.isEmpty())
    {
        ui->label->setText("密码为空");
    }
    else if(s1 == s2)
    {
        ui->label->setText("密码相同");
    }
    else
    {
        ui->label->setText("密码不同");
    }
}

void Widget::on_lineEdit_2_textEdited(const QString &arg2)
{
    (void)arg2;
    const QString& s1 = ui->lineEdit->text();
    const QString& s2 = ui->lineEdit_2->text();
    //进行判断
    if(s1.isEmpty() && s2.isEmpty())
    {
        ui->label->setText("密码为空");
    }
    else if(s1 == s2)
    {
        ui->label->setText("密码相同");
    }
    else
    {
        ui->label->setText("密码不同");
    }
}

运行结果:

代码示例(切换显示密码):

首先,创建一个输入框和一个复选按钮

修改widget.cpp文件

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    ui->lineEdit->setEchoMode(QLineEdit::Password);
}

添加槽函数

cpp 复制代码
void Widget::on_checkBox_toggled(bool checked)
{
    if(checked)
    {
        ui->lineEdit->setEchoMode(QLineEdit::Normal);
    }
    else
    {
        ui->lineEdit->setEchoMode(QLineEdit::Password);
    }
}

运行代码:

二、QTextEdit

QTextEdit 是一个多行文本输入控件,同时支持富文本和 Markdown 编辑功能。当内容超出编辑区域时,它会自动显示滚动条。

属性 说明
markdown 输入框中的内容支持Markdown格式,系统会自动将Markdown文本渲染为HTML格式显示
html 输入框支持多种HTML标签内容,包括图片(img)和表格(table)等常见元素。
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) 文本被选中/取消选中时触发

代码样例(获取多行输入框的内容):

首先,创建一个多行输入框和一个label

为多行输入框添加 slot 函数来处理 textChanged 信号:

使用 toPlainText 方法获取文本框内的纯文本内容

QTextEdit 还提供了 toMarkdown 和 toHtml 方法,可根据实际需求选择合适的文本获取方式

cpp 复制代码
void Widget::on_textEdit_textChanged()
{
    const QString& content = ui->textEdit->toPlainText();
    qDebug() << content;
    ui->label->setText(content);
}

运行代码:

代码样例(验证输入框的各种信号):

首先,创建一个多行输入框

给输入框添加几个槽函数

cpp 复制代码
//文本内容改变时触发该信号
void Widget::on_textEdit_textChanged()
{
    qDebug() << "[textChanged]" << ui->textEdit->toPlainText();
}
//选中范围改变时触发该信号
void Widget::on_textEdit_selectionChanged()
{
    //QTextEdit中有一个QTextCursor对象,通过该对象可以获取到光标位置和选中的内容
    const QTextCursor& cursor = ui->textEdit->textCursor();
    qDebug() << "[selectionChanged]" << cursor.selectedText();
}
//光标移动时触发该信号
void Widget::on_textEdit_cursorPositionChanged()
{
    const QTextCursor& cursor = ui->textEdit->textCursor();
    qDebug() << "[cursorPositionChanged]" << cursor.position();
}
//可以进行undo操作的时候触发
void Widget::on_textEdit_undoAvailable(bool b)
{
    qDebug() << "[undoAvailable]" << b;
}
//可以在redo操作的时候触发
void Widget::on_textEdit_redoAvailable(bool b)
{
    qDebug() << "[redoAvailable]" << b;
}
//文本被选中或者取消选中的时候触发
void Widget::on_textEdit_copyAvailable(bool b)
{
  qDebug() << "[copyAvailable]" << b;
}

运行代码:

三、QComboBox

QComboBox 表示下拉框

属性 说明
currentText 当前选中的文本
currentIndex 当前选中的条目下标,从 0 开始计算. 如果当前没有条目被选中, 值为 -1
editable 是否允许修改,设为 true 时, QComboBox 的行为就非常接近 QLineEdit , 也可以设置 validator
iconSize 下拉框图标 (小三角) 的大小
maxCount 最多允许有多少个条目

核心方法

方法 说明
addItem(const QString&) 添加⼀个条目
currentIndex() 获取当前条目的下标,从 0 开始计算. 如果当前没有条目被选中, 值为 -1
currentText() 获取当前条目的文本内容

核心信号

信号 说明
activated(int)、activated(const QString & text) 当用户选择了⼀个选项时发出,这个时候相当于用户点开下拉框, 并且鼠标划过某个选项,此时还没有确认做出选择
currentIndexChanged(int)、currentIndexChanged(const QString& text) 当前选项改变时发出,此时用户已经明确的选择了⼀个选项,用户操作或者通过程序操作都会触发这个信号
editTextChanged(const QString &text) 当编辑框中的文本改变时发出(editable 为 true 时有效)

代码样例(使用下拉框模拟麦当劳点餐):

首先,在界面上创建三个下拉框和一个按钮

再编写widget.cpp文件

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //初始化三个下拉框
    ui->comboBox->addItem("板烧鸡腿堡");
    ui->comboBox->addItem("香辣鸡腿堡");
    ui->comboBox->addItem("培根疏萃堡");

    ui->comboBox_2->addItem("薯条");
    ui->comboBox_2->addItem("鸡块");
    ui->comboBox_2->addItem("薯饼");

    ui->comboBox_3->addItem("可乐");
    ui->comboBox_3->addItem("热巧克力");
    ui->comboBox_3->addItem("牛奶");
}

编写按钮的槽函数

cpp 复制代码
void Widget::on_pushButton_clicked()
{
    qDebug() << "汉堡选择" << ui->comboBox->currentText();
    qDebug() << "小食选择" << ui->comboBox_2->currentText();
    qDebug() << "饮料选择" << ui->comboBox_3->currentText();
}

运行代码:

代码样例(从文件中加载下拉框选项):

首先,在界面创建一个下拉框:

创建一个文件

修改widget.cpp文件

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //打开文件
    std::ifstream file("d:/config.txt");
    std::string line;
    //读取每一行
    while(std::getline(file, line))
    {
        ui->comboBox->addItem(QString::fromStdString(line));
    }
    file.close();
}

运行代码:

四、QSpinBox

使用 QSpinBox 或 QDoubleSpinBox 来表示"数值输入框",这是一种带有增减按钮的输入控件。它专门用于输入整数或浮点数,用户可以通过点击按钮来调整数值大小。

属性 说明
value 存储的数值
singleStep 每次调整的 "步长", 按下一次按钮数据变化多少
displayInteger 数字的进制
minimum 最小值
maximum 最大值
suffix 后缀
prefix 前缀
wrapping 是否运行换行
frame 是否带边框
alignment 文字对齐方式
readOnly 是否允许修改
buttonSymbol 按钮上的图标:UpDownArrows 上下箭头形式;PlusMinus 加减号形式;NoButtons 没有按钮
accelerated (加速的) 按下按钮时是否为快速调整模式
correctionMode 输入有误时如何修正:QAbstractSpinBox::CorrectToPreviousValue:当用户输入无效值时(比如在仅支持正整数的SpinBox中输入负数),控件会自动恢复为前一个有效值。例如,若SpinBox当前值为1,用户输入-1(无效值)后,数值将自动回退到1;QAbstractSpinBox::CorrectToNearestValue:当用户输入无效值时,SpinBox会自动调整为最接近的有效值。例如,若SpinBox初始值为1,用户输入无效值-1时,系统会将其修正为0。
keyboardTrack 是否开启键盘跟踪:设为 true, 每次在输入框输入一个数字, 都会触发一次 valueChanged() 和textChanged() 信号;设为 false, 只有在最终按下 enter 或者输入框失去焦点, 才会触发valueChanged() 和 textChanged() 信号

核心信号

信号 说明
textChanged(QString) 微调框的文本发生改变时会触发,参数 QString 带有 前缀 和 后缀
valueChanged(int) 微调框的文本发生改变时会触发,参数 int, 表示当前的数值.

代码样例(调整麦当劳购物车中的份数):

首先,在界面上创建三个下拉框、三个微调框和一个按钮

编写widget.cpp文件

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //初始化下拉框
    ui->comboBox->addItem("板烧鸡腿堡");
    ui->comboBox->addItem("香辣鸡腿堡");
    ui->comboBox->addItem("双层吉士堡");
    ui->comboBox_2->addItem("薯条");
    ui->comboBox_2->addItem("薯饼");
    ui->comboBox_2->addItem("鸡块");
    ui->comboBox_3->addItem("可乐");
    ui->comboBox_3->addItem("热咖啡");
    ui->comboBox_3->addItem("热牛奶");

    //初始化微调框,设置取值范围
    ui->spinBox->setValue(1);
    ui->spinBox->setRange(1, 10);
    ui->spinBox_2->setValue(1);
    ui->spinBox_2->setRange(1, 10);
    ui->spinBox_3->setValue(1);
    ui->spinBox_3->setRange(1, 10);
}

运行代码:

相关推荐
利刃大大3 小时前
【JavaSE】十三、枚举类Enum && Lambda表达式 && 列表排序常见写法
java·开发语言·枚举·lambda·排序
float_六七4 小时前
Java反射:万能遥控器拆解编程
java·开发语言
han_hanker4 小时前
java 异常类——详解
java·开发语言
源码获取_wx:Fegn08954 小时前
基于springboot + vue健身房管理系统
java·开发语言·前端·vue.js·spring boot·后端·spring
LinHenrY12274 小时前
初识C语言(自定义结构:结构体)
c语言·开发语言
Matlab仿真实验室4 小时前
基于Matlab实现可见光通信仿真
开发语言·matlab
CreasyChan4 小时前
C# 反射详解
开发语言·前端·windows·unity·c#·游戏开发
毕设源码-赖学姐4 小时前
【开题答辩全过程】以 基于Java的保定理工科研信息管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
派大鑫wink4 小时前
从零到精通:Python 系统学习指南(附实战与资源)
开发语言·python