Qt常用控件

Push Button

使用 QPushButton 表示一个按钮. 这也是当前我们最熟悉的一个控件了.QPushButton 继承自 QAbstractButton . 这个类是一个抽象类. 是其他按钮的父类.

在 Qt Designer 中也能够看到这里的继承关系.

QAbstractButton 中, 和 QPushButton 相关性较大的属性

|--------------------|-----------------------------------------------------------------------------------------------------------|
| 属性 | 说明 |
| text | 按钮中的文本 |
| icon | 按钮中的图标 |
| iconSize | 按钮中图标的尺寸 |
| shortCut | 按钮对应的快捷键 |
| autoRepeat | 按钮是否会重复触发. 当鼠标左键按住不放时, 如果设为 true, 则会持续产生鼠标点击事件; 如果设为 false, 则必须释放鼠标, 再次按下鼠标时才能产生点击事件. (相当于游戏手柄上的 "连发" 效果) |
| autoRepeatDelay | 重复触发的延时时间. 按住按钮多久之后, 开始重复触发. |
| autoRepeatInterval | 重复触发的周期. |

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

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

    //设置这些按钮的图标
    ui->pushButton->setIcon(QIcon(":/pink.png"));
    ui->pushButton->setIconSize(QSize(80,80));
    ui->pushButton_up->setIcon(QIcon(":/up.png"));
    ui->pushButton_down->setIcon(QIcon(":/down.png"));
    ui->pushButton_left->setIcon(QIcon(":/left.png"));
    ui->pushButton_right->setIcon(QIcon(":/right.png"));

   // 1.通过案件的名字设置快捷键
//    ui->pushButton_up->setShortcut(QKeySequence("ctrl + w"));
//    ui->pushButton_down->setShortcut(QKeySequence("s"));
//    ui->pushButton_left->setShortcut(QKeySequence("a"));
//    ui->pushButton_right->setShortcut(QKeySequence("d"));

    //2.通过按键的枚举来设置按键快捷键
        ui->pushButton_up->setShortcut(QKeySequence( Qt::Key_W));
        ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_S));
        ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_A));
        ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_D));

        //开启鼠标点击的连发功能
        ui->pushButton_up->setAutoRepeat(true);
        ui->pushButton_down->setAutoRepeat(true);
        ui->pushButton_left->setAutoRepeat(true);
        ui->pushButton_right->setAutoRepeat(true);
}

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


void Widget::on_pushButton_up_clicked()
{
    //获取button的位置
    QRect rect = ui->pushButton->geometry();
    //基于上次位置获取新位置
    ui->pushButton->setGeometry(rect.x(),rect.y()-5,rect.width(),rect.height());
}

void Widget::on_pushButton_down_clicked()
{
    //获取button的位置
    QRect rect = ui->pushButton->geometry();
    //基于上次位置获取新位置
    ui->pushButton->setGeometry(rect.x(),rect.y()+5,rect.width(),rect.height());
}

void Widget::on_pushButton_left_clicked()
{
    //获取button的位置
    QRect rect = ui->pushButton->geometry();
    //基于上次位置获取新位置
    ui->pushButton->setGeometry(rect.x()-5,rect.y(),rect.width(),rect.height());
}
void Widget::on_pushButton_right_clicked()
{
    //获取button的位置
    QRect rect = ui->pushButton->geometry();
    //基于上次位置获取新位置
    ui->pushButton->setGeometry(rect.x()+5,rect.y(),rect.width(),rect.height());
}

按钮快捷键默认是连发的,但是鼠标点击按钮就不行,通过setAutoRepeat来设置

注意:

参数是QKeySequence对象,表示一组快捷键

Radio Buttion

QRadioButton 是单选按钮. 可以让我们在多个选项中选择一个.

作为 QAbstractButton 和 QWidget 的子类, 上面介绍的属性和用法, 对于 QRadioButton同样适用.

QAbstractButton 中和 QRadioButton 关系较大的属性

|---------------|--------------------------------------------------------|
| API | 说明 |
| checkable | 是否能选中 |
| checked | 是否已经被选中. checkable 是 checked 的前提条件. |
| autoExclusive | 是否排他. 选中一个按钮之后是否会取消其他按钮的选中. 对于 QRadioButton 来说默认就是排他的. |

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //添加一个默认选项
    ui->radioButton_male->setChecked(true);
     ui->label->setText("您选择的性别为:男");
     //警用 其他 选项
     //checkable 只是能够让按钮不被选中,仍然是可以响应点击事件的
    // ui->radioButton_other->setChecked(false);

     //ui->radioButton_other->setEnabled(false);
     ui->radioButton_other->setDisabled(true);
}

Widget::~Widget()
{
    delete ui;

}


void Widget::on_radioButton_male_clicked()
{
    //把界面上的label进行更新
    ui->label->setText("您选择的性别为:男");
}

void Widget::on_radioButton_female_clicked()
{
    //把界面上的label进行更新
    ui->label->setText("您选择的性别为:女");
}

void Widget::on_radioButton_other_clicked()
{
    //把界面上的label进行更新
    ui->label->setText("您选择的性别为:其他");
}
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include<QButtonGroup>


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

    //使用QButtonGroup对单选按钮进行分组
    QButtonGroup* group1 =new QButtonGroup(this);
    QButtonGroup* group2 =new QButtonGroup(this);
    QButtonGroup* group3 =new QButtonGroup(this);

    //把上述单选按钮放到不同的组里
    group1->addButton(ui->radioButton);
    group1->addButton(ui->radioButton_2);
    group1->addButton(ui->radioButton_3);

    group2->addButton(ui->radioButton_4);
    group2->addButton(ui->radioButton_5);
    group2->addButton(ui->radioButton_6);

    group3->addButton(ui->radioButton_7);
    group3->addButton(ui->radioButton_8);

}

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

Check Box

QCheckBox 表示复选按钮. 可以允许选中多个.和 QCheckBox 最相关的属性也是 checkable 和 checked , 都是继承自QAbstractButton .

今天你的任务是?

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

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

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


void Widget::on_pushButton_clicked()
{
    QString result = "今天你的安排是: ";
    if(ui->checkBox->isChecked())
    {
    result +=ui->checkBox->text();
    }
    if(ui->checkBox_2->isChecked())
    {
    result +=ui->checkBox_2->text();
    }
    ui->label->setText(result);
}

Tool Button

QToolButton 的大部分功能, 和 QPushButton 是一致的. 但是 QToolButton 主要应用在工

具栏, 菜单等场景

Label

QLabel 可以用来显示文本和图片

|-------------------|-----------------------------------------------------------------------------------------------------------------|
| API | 说明 |
| text | QLabel 中的文本 |
| textFormat | 文本的格式. Qt::PlainText 纯文本 Qt::RichText 富文本(支持 html 标签) Qt::MarkdownText markdown 格式 Qt::AutoText 根据文本内容自动决定文本格式. |
| pixmap | QLabel 内部包含的图片. |
| scaledContents | 设为 true 表示内容自动拉伸填充 QLabel 设为 false 则不会自动拉伸 |
| alignment | 对齐方式. 可以设置水平和垂直方向如何对齐. |
| wordWrap | 设为 true 内部的文本会自动换行. 设为 false 则内部文本不会自动换行. |
| indent | 设置文本缩进. 水平和垂直方向都生效. |
| margin | 内部文本和边框之间的边距.不同于于 indent, 但是是上下左右四个方向都同时有效.而 indent 最多只是两个方向有效(具体哪两个方向有效取决于 alignment ) |
| openExternalLinks | 是否允许打开一个外部的链接. (当 QLabel 文本内容包含 url 的时候涉及到) |
| buddy | 给 QLabel 关联一个 "伙伴" , 这样点击 QLabel 时就能激活对应的伙伴. 例如伙伴如果是一个 QCheckBox, 那么该 QCheckBox就会被选中. |
[Label]

效果差异text显示纯文本,富文本能识别并应用html标签,markdown能用markdown符号

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

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

    //先把QLabel设置成窗口一样大,并且把这个QLabel的左上角设置到窗口的左上角这里
    //让整个QLabel铺满整个窗口
    QRect rect = this->geometry();
    ui->label->setGeometry(0,0,rect.width(),rect.height());

    QPixmap pixmap(":/qicon.png");
    ui->label->setPixmap(pixmap);
    //启动自动拉伸,使图片填充满整个窗口
    ui->label->setScaledContents(true);

}

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

但是有一个弊端,就是我拉伸窗口图片仍然是这个效果

可以让Widget窗口类,重写父类QWidget的resizeEvent虚函数,因为在鼠标拖动窗口尺寸的过程中这个函数会被反复调用执行,每次触发一个resuzeEvent事件都会调用一次对应的虚函数,因为多态,我们进行了函数重写,调用父类的虚函数就会实际调用到子类的对应的函数

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QResizeEvent>

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

    //先把QLabel设置成窗口一样大,并且把这个QLabel的左上角设置到窗口的左上角这里
    //让整个QLabel铺满整个窗口
    QRect rect = this->geometry();
    ui->label->setGeometry(0,0,rect.width(),rect.height());

    QPixmap pixmap(":/qicon.png");
    ui->label->setPixmap(pixmap);
    //启动自动拉伸,使图片填充满整个窗口
    ui->label->setScaledContents(true);

}

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

//event形参包含了触发resize事件的这一时刻窗口的尺寸大小
void Widget::resizeEvent(QResizeEvent *event)
{
     ui->label->setGeometry(0,0,event->size().width(),event->size().height());
}

拓展

在实际编程中,指定回调函数其实有很多种写法

  1. 设置指针函数
  2. 设置仿函数
  3. 设置lambda
  4. 通过重写父类虚函数
  5. qt的信号槽
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

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

    //给label设置不同的属性
    ui->label->setText("这是一段文本");/*
    ui->label->setAlignment(Qt::AlignCenter  | Qt::AlignVCenter);*/

//    ui->label->setAlignment(Qt::AlignRight  | Qt::AlignVCenter);

    ui->label->setAlignment(Qt::AlignRight  | Qt::AlignTop);
}

Widget::~Widget()
{
    delete ui;
}
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

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

    //给label设置不同的属性
    //设置对齐方式
    ui->label->setText("这是一段文本");
    ui->label->setAlignment(Qt::AlignRight  | Qt::AlignTop);

    //设置自动换行
    ui->label_2->setText("这是一段很长的文本这是一段很长的文本这是一段很长的文本");
    ui->label_2->setWordWrap(true);

    //设置缩进
    ui->label_3->setText("这是一段很长的文本这是一段很长的文本这是一段很长的文本");
    ui->label_3->setWordWrap(true);
    ui->label_3->setIndent(50);

    //设置边距
    ui->label_4->setText("这是一段很长的文本这是一段很长的文本这是一段很长的文本");
    ui->label_4->setWordWrap(true);
    ui->label_4->setMargin(10);
}

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

伙伴

Qt中QLabel中写的文本,是可以指定"快捷键",此处快捷键的规则功能要比QPushButton弱很多,是在文本中使用&跟上一个字符来表示快捷键,比如&A表示通过键盘上的alt + a 来触发这个快捷键,&B 就是alt + b来触发,绑定了伙伴关系就可以通过快捷键来选中按钮

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置label和radioButton的伙伴关系
    ui->label->setBuddy(ui->radioButton);
    ui->label_2->setBuddy(ui->radioButton_2);
}

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

LCD Number

QLCDNumer 是一个专门用来显示数字的控件. 类似于 "老式计算器" 的效果.

|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| API | 说明 |
| intValue | QLCDNumber 显示的数字值(int). |
| value | QLCDNumber 显示的数字值(double).和 intValue 是联动的.例如给 value 设为 1.5, intValue 的值就是 2.另外, 设置 value 和 intValue 的方法名字为 display , 而不是setValue 或者 setIntValue . |
| digitCount | 显示几位数字. |
| mode | 数字显示形式. 1. QLCDNumber::Dec :十进制模式,显示常规的十进制数字。 2. QLCDNumber::Hex :十六进制模式,以十六进制格式显示数字。 3. QLCDNumber::Bin :二进制模式,以二进制格式显示数字。 4. QLCDNumber::Oct :八进制模式,以八进制格式显示数字。 只有十进制的时候才能显示小数点后的内容. |
| segmentStyle | 设置显示风格. 1. QLCDNumber::Flat :平面的显示风格,数字呈现在一个平坦的表面上。 2. QLCDNumber::Outline :轮廓显示风格,数字具有清晰的轮廓和阴影效 果。 3. QLCDNumber::Filled :填充显示风格,数字被填充颜色并与背景区分开。 |
| smallDecimalPoint | 设置比较小的 小数点. |

定时器的实现方式

1,绑定槽函数,调用内部定时器

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include<QTimer>
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lcdNumber->display(10);
    //创建一个QTimeer实例
    timer = new QTimer(this);
    //把QTimer 的 timeout 信号和槽函数来连接
    connect(timer,&QTimer::timeout,this,&Widget::handle);
    //启动定时器,参数是触发timeout的周期,单位是ms
    timer ->start(1000);
}

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

void Widget::handle()
{
 qDebug()<<"handle";
 //先拿到LCDNumber中的数字
 int value = ui->lcdNumber->intValue();
         if(value<=0)
 {
         timer->stop();
         return;
}
ui->lcdNumber->display(value-1);
}

上述代码是在构造函数中执行的,那我是不是可以开一个多线程来实现

cpp 复制代码
    std::thread t([this](){
      int value =  this->ui->lcdNumber->intValue();
        std::this_thread::sleep_for(std::chrono::seconds(1));
        while(true)
          {
              //先休眠1s
              std::this_thread::sleep_for(std::chrono::seconds(1));
              if(value<=0)
              {
                  break;
              }
              value-=1;
              ui->lcdNumber->display(value);
          }
    });

答案是,不行,对于GUI来说,内部包含了很多隐藏状态,Qt为了保证修改界面的过程中,线程安全是不会受到影响的,于是静止了其他线程直接参与修改,所以必须在主线程中进行界面修改,而槽函数默认就是主线程调用,主函数main里面,return a。exec();就使主线程进入"事件循环"

ProgressBar

使用 QProgressBar 表示一个进度条.注意, 不要把 ProgessBar 拼写成 ProcessBar !

|------------------|---------------------------------------------------------------------------------------------------------------|
| API | 说明 |
| minimum | 进度条最小值 |
| maximum | 进度条最大值 |
| value | 进度条当前值 |
| alignment | 文本在进度条中的对齐方式. * Qt::AlignLeft : 左对齐 * Qt::AlignRight : 右对齐 * Qt::AlignCenter : 居中对齐 * Qt::AlignJustify : 两端对齐 |
| textVisible | 进度条的数字是否可见. |
| orientation | 进度条的方向是水平还是垂直 |
| invertAppearance | 是否是朝反方向增长进度 |
| textDirection | 文本的朝向. |
| format | 展示的数字格式. * %p :表示进度的百分比(0-100) * %v :表示进度的数值(0-100) * %m :表示剩余时间(以毫秒为单位) * %t :表示总时间(以毫秒为单位) |

创建一个进度条,让这个进度条的进度跟随时间增长,每隔100ms,让进度条+1

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include<QTimer>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::handle);
    //启动定时器
    timer->start(100);

}

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

void Widget::handle()
{
    //获取到当前进度条的数值
    int value = ui->progressBar->value();
    if(value >= 100)
    {
        //进度条满了,停止计时器
        timer->stop();
        return;
    }
    ui->progressBar->setValue(value + 1);
}

注意:我在.cpp中包含了QTimer,但是.h却没有,.h里面用到了QTimer但是依旧能编译成功这是为什么?

Widget类前面提供了QTimer类的声明,此时就可以在Widget中声明QTimer的指针/引用类型的成员,后续真的要使用QTimer就需要包含QTimer的头文件,这是C++的特性,Qt引入了能够提升编译速度

QSS也可以设置Widget的子类,

Calendar Widget

QCalendarWidget 表示一个 "日历" , 形如

|------------------------|------------------------|
| 属性 | 说明 |
| selectDate | 当前选中的驲期 |
| minimumDate | 最小日期 |
| maximumDate | 最大日期 |
| firstDayOfWeek | 每周的第一天(也就是日历的第一列) 是周几. |
| gridVisible | 是否显示表格的边框 |
| selectionMode | 是否允许选择日期 |
| navigationBarVisible | 日历上方标题是否显示 |
| horizontalHeaderFormat | 日历上方标题显示的日期格式 |
| verticalHeaderForma | 日历第一列显示的内容格式 |
| dateEditEnabled | 是否允许日期被编辑 |

重要信号

|---------------------------------|--------------------------------------------|
| API | 说明 |
| selectionChanged(const QDate&) | 当选中的日期发生改变时发出 |
| activated(const QDate&) | 当双击一个有效的日期或者按下回车键时发出,形参是一个QDate类型,保存了选中的日期 |
| currentPageChanged(int, int) | 当年份月份改变时发出,形参表示改变后的新年份和月份 |

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


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

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


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

}

Line Edit

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是新的文本。 代码对文本的修改不能触发这个信号. |

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


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);
     //设置长度为11位的数字
    ui->lineEdit_phone->setInputMask("000-0000-0000");
}



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


void Widget::on_pushButton_submit_clicked()
{
    QString gender = ui->radioButton_male->isChecked()?"男":"女";

    qDebug()<<"姓名: "<< ui->lineEdit_name->text();
    qDebug()<<"密码: "<< ui->lineEdit_password->text();
    qDebug()<<"性别: "<< gender;
    qDebug()<<"电话: "<< ui->lineEdit_phone->text();
}

inputMask功能比较有限,只能进行简单的验证,就需要进行"正则表达式"

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

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

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

}

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


void Widget::on_lineEdit_textEdited(const QString &text)
{
    QString string = text;
    int pos =0;
    if(ui->lineEdit->validator()->validate(string,pos)==QValidator::Acceptable)
    {
        //验证通过
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton->setEnabled(false);
    }
}

满足条件就解开提交按钮,不满住就禁用

重复验证密码是否一致

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

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("密码为空");

}

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


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

void Widget::on_lineEdit_2_textEdited(const QString &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("两次输入的密码不一致");
    }
}

显示隐藏密码

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

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

    //初始情况下,输入框按照密码方式来显示
    ui->lineEdit->setEchoMode(QLineEdit::Password);
}

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


void Widget::on_checkBox_toggled(bool checked)
{
    if(checked)
    {
        //ture 表示选中,显示密码设为Normal
         ui->lineEdit->setEchoMode(QLineEdit::Normal);
    }
    else
    {   //false 表示没选中 隐藏密码  设为Password
         ui->lineEdit->setEchoMode(QLineEdit::Password);
    }
}
相关推荐
bksczm2 小时前
Linux之日志和线程池、内存池
java·开发语言
笨蛋不要掉眼泪2 小时前
Java虚拟机:对象复活、引用强度与Stop-The-World
java·开发语言·jvm
布朗克1682 小时前
Go 入门到精通-33-unsafe 与 CGO
开发语言·后端·golang·unsafe·cgo
爱写代码的阿森3 小时前
鸿蒙三方库 | harmony-utils之RegexUtil正则匹配验证详解
服务器·华为·harmonyos·鸿蒙·huawei
157092511343 小时前
【无标题】
开发语言·python·算法
雨的旋律20993 小时前
ubuntu2604
linux·运维·服务器
xieliyu.3 小时前
MySQL 存储过程详解:概念、创建与删除全教程
开发语言·数据库·mysql
2zcode3 小时前
项目文档:基于MATLAB最小二乘支持向量机的睡眠分期智能监测系统设计与实现
开发语言·支持向量机·matlab
三言老师3 小时前
mkdir创建多级目录,目录创建基础实操
linux·运维·服务器
twcc_come3 小时前
安全策略配置实验报告
开发语言·php