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());
}
拓展:
在实际编程中,指定回调函数其实有很多种写法
- 设置指针函数
- 设置仿函数
- 设置lambda
- 通过重写父类虚函数
- 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);
}
}
