Qt 常用控件 - 5https://blog.csdn.net/Small_entreprene/article/details/149878396?spm=1001.2014.3001.5501

Calendar Widget

QCalendarWidget 表示一个"日历"控件。

核心属性
属性 说明
selectDate 当前选中的日期
minimumDate 最小日期(默认不动)
maximumDate 最大日期(默认不动)
firstDayOfWeek 每周的第一天(也就是日历的第一列)是周几
gridVisible 是否显示表格的边框
selectionMode 是否允许多选日期
navigationBarVisible 日历上方标题是否显示
horizontalHeaderFormat 日历上方标题显示的日期格式
verticalHeaderFormat 日历第一列显示的内容格式
dateEditEnabled 是否允许日期被编辑

horizontal --- h --- 水平

vertical --- v --- 垂直

核心信号
  • selectionChanged(const QDate&):当选中的日期发生改变时,发出这个信号

  • activated(const QDate&):当双击一个有效的日期或者按下回车键时发出,形参是一个QDate类型,保存了选中的日期

  • currentPageChanged(int, int):当年份月份改变时发出,形参表示改变后的新年份和月份

代码示例:获取选中的日期

在界面上创建一个 QCalendarWidget 和一个 label,objectName 分别为 calendarWidget 和 TextLabel:

为 QCalendarWidget 添加 slot 函数:

void Widget::on_calendarwidget_selectionChanged()
{
    QDate date = ui->calendarWidget->selectedDate();
    qDebug() << date;
    ui->label->setText(date.toString());
}

执行程序,可以看到当选择不同的日期时,label 中的内容就会随之改变。

我们显示类控件的介绍就基本结束啦,接下来,就是输入类控件了!

输入类控件

Line Edit

QLineEdit 用来表示单行输入框,可以输入一段文本,但是不能换行。

核心属性
属性 说明
text

输入框中的文本:

(1)通过代码中设置 text,界面上的文本会发生变化

(2)直接操作写该界面上的文本(输入框,可编辑),text 的属性也会发生变化

inputMask 输入内容格式约束
maxLength 最大长度
frame 是否添加边框
echoMode 显示方式:
QLineEdit::Normal:默认值,显示输入的文本
QLineEdit::Password:输入的字符会被隐藏,通常用星号(*)或等号(=)代替
QLineEdit::NoEcho:不显示任何输入的字符
cursorPosition 光标所在位置
alignment 文字对齐方式,设置水平和垂直方向的对齐
dragEnabled 是否允许拖拽
readOnly 是否是只读的(不允许修改)
placeHolderText 当输入框内容为空的时候显示的提示信息
clearButtonEnabled 是否会自动显示出"清除按钮"

核心信号

信号 说明
cursorPositionChanged(int old, int new) 当鼠标移动时发出此信号
editingFinished() 当按返回或者回车键时,或者行编辑失去焦点时发出
returnPressed() 当返回或回车键按下时发出,如果设置了验证器,必须要验证通过才能触发
selectionChanged() 当选中的文本改变时发出
textChanged(const QString &text) 当QLineEdit中的文本改变时发出,text是新的文本,代码对文本的修改能够触发这个信号
textEdited(const QString &text) 当QLineEdit中的文本改变时发出,text是新的文本,代码对文本的修改不能触发这个信号

代码示例:录入个人信息

在界面上创建(4个label)三个输入框和两个单选按钮,一个普通按钮:

三个输入框的 objectName 为 LineEdit_nameLineEdit_passwordLineEdit_phone

两个单选按钮的 objectName 为 radioButton_maleradioButton_female

按钮的 objectName 为 pushButton

编写 widget.cpp,在构造函数中编写初始化代码:

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);
    // 手机号码是有固定格式的,此处的0,代表数字
    ui->lineEdit_phone->setInputMask("000-0000-0000");
}

为按钮添加 slot 函数:

void Widget::on_pushButton_clicked()
{
    QString gender = ui->radioButton_male->isChecked() ? "男" : "女";
    
    qDebug() << "姓名: " << ui->LineEdit_name->text()
             << "密码: " << ui->LineEdit_password->text()
             << "性别: " << gender
             << "手机: " << ui->LineEdit_phone->text();
}

执行程序,可以看到随着用户输入内容之后,点击按钮,就能打印输入的信息。此处我们只是进行简单打印,实际开发中可以通过网络把数据发给服务器!

inputMask 功能比较有限,只能进行简单的验证,这时候我们就需要使用正则表达式 --- 本质上就是一个带有特殊符号的字符串,特殊字符串用来表示另一个字符串的特征!此时就可以借助正则表达式来描述一些具有一定特点的字符串!(以什么开头/结尾,重复穿出现几次....)基于这些特点,就可以完成字符串的匹配!

正则表达式是一种在计算机中常用的,使用特殊字符描述一个字符串的特征的机制。在进行字符串匹配时非常有用。

正则表达式的语法还比较复杂,一般都是随用随查,不需要背下来。

参考:
正则表达式文档:正则表达式语法 | Microsoft Learn

正则表达式在线工具:正则表达式语法测试工具 - 在线工具

代码示例:使用正则表达式验证输入框的数据

要求:在输入框中输入一个合法的电话号码(1开头,11位,全都是数字)。如果验证不通过,则确定按钮无法点击。

在界面上创建输入框和一个按钮。

编写 widget.cpp,把按钮初始 enabled 设为 false,给输入框添加验证器:

使用 QRegularExpressionValidator 创建一个验证器对象。Qt 中内置了四个主要的验证器对象:

QRegularExpressionValidator 在匹配性能上做出了一定优化,但是从使用角度讲,和 QRegExpValidator 差别不大。

#include "widget.h"
#include "ui_widget.h"
#include <QRegularExpressionValidator>

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

    // 就需要给单行输入框设置验证器,基于正则表达式来完成验证的!
    QRegularExpression regExp("^1\\d{10}$");
    ui->lineEdit->setValidator(new QRegularExpressionValidator(regExp));
}

给 lineEdit 添加 textEdited 信号的 slot 函数:

on_lineEdit_textEdited 的参数是当前输入框的内容

通过 lineEdit->validator() 获取到内置的验证器

通过 validate 方法验证文本是否符合要求

  • 第一个参数填写的是要验证的字符串。由于参数要求是 QString& 而不是 const QString&,需要把这个变量复制一下
  • 第二个参数是一个 int&,是输出型参数。当验证的字符串不匹配时,返回这个字符串的长度(没有什么实质作用)
void Widget::on_lineEdit_textEdited(const QString &text)
{
    QString content = text;
    int pos = 0;
    if(ui->lineEdit->validator()->validate(content, pos) == QValidator::Acceptable)
    {
        // 验证通过
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton->setEnabled(false);
    }
}

执行程序,观察效果。可以看到此时尝试输入字母是无法输入的,并且只有当输入的内容符合要求,确定按钮才能被使用。

代码示例:验证两次输入的密码一致

在界面上创建两个输入框和一个 label

编写代码,设置两个输入框的 echoMode 为 Password:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    // 初始化,把这两个的输入框的 echoMode 设置一下
    ui->lineEdit->setEchoMode(QLineEdit::Password);
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);
    
    ui->label->setText("密码为空");
}

给两个输入框设置 textEdited slot 函数:

void Widget::on_lineEdit_textEdited(const QString &arg1)
{
    (void)arg1;
    this->compare();
}


void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{
    (void)arg1;
    this->compare();
}

void Widget::compare()
{
    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,设置输入框的 echoMode 为 Password:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->LineEdit->setEchoMode(QLineEdit::Password);
}

为 checkBox 添加 slot 函数:

void Widget::on_checkBox_toggled(bool checked)
{
    if (checked) {
        ui->LineEdit->setEchoMode(QLineEdit::Normal);
    } else {
        ui->LineEdit->setEchoMode(QLineEdit::Password);
    }
}

执行程序,可以看到切换复选框的状态,就可以控制输入框显示密码

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐