小编个人主页详情—请点击小编个人gitee代码仓库—请点击Qt系列专栏—请点击倘若命中无此运孤身亦可登昆仑送给屏幕面前的读者朋友们和小编自己!目录前言一、控件概述二、QWidget的enable属性铺垫知识enable属性理论讲解isEnabledsetEnabled代码实现一代码实现二总结前言【Qt】信号和槽四信号和槽断开连接lambda表达式定义槽函数小结——书接上文 详情请点击——本文由小编为大家介绍——【Qt】常用控件一控件概述QWidget的enabled属性isEnabledsetEnabled一、控件概述我们要实现一个图形化界面的程序需要用到控件而Qt已经给我们提供了很多的控件所以我们就需要学习和了解这些控件学习如何使用这些控件而编程对于我们来讲并不是从头发明轮子而是站在巨人的肩膀上也就是说一个图形化界面上的内容并不需要我们全部都从零开始实现Qt中已经提供了很多内置的控件了例如按钮文本框单选按钮复选按钮下拉框等咱们只需要拿过来就可以直接进行使用其中我们把界面上的各种元素各种部分也就是按钮文本框单选按钮复选按钮下拉框等统称为控件所以此时我们就需要理解控件了控件又叫做Widget而对于Widget真实的英语翻译是小部件小组件的意思那么其实在计算机中称作小部件小部件是不够专业的那么我们使用控件Widget是更为专业的其实取名字还是挺讲究的那么对于Java来讲就特别讲究这个例如在JavaSE中学到的包装类自动装箱自动拆箱就显得很高级那么本质是什么呢包装类的本质就是把intdouble等类型使用class类封装一下而自动装箱自动拆箱的本质就是包装类和内置类的隐式类型转换所以我们想要见见Qt中的控件那么我们该如何见见呢所以此时我们打开之前的项目那么点击ui文件此时就会进入Qt Designer界面那么Qt Designer左侧红色框内的。就是Qt给我们已经内置好的控件所以我们接下来就需要对这些常用控件进行学习那么其实在上古时期开发图形化界面GUI的程序对于控件是没有什么概念的即零感知的界面上显示出来的东西全部都是画出来的而显示器显示的内容可以理解为一块画布那么此时操作系统就可以提供一些API让我们在画布上面进行画例如画点画线画矩形画三角形填充各种颜色等 并且如果我们在大学的专业课中学习过计算机图形学这门课那么我们其实对于画的过程会更好理解所以此时如上此时开发一个图形化界面的程序就相当于先画出一个矩形的窗口然后再画出右上角的三个图标最小化最大化关闭然后左上角也有对应旁边的文字说明即蛊界这一款游戏所以左侧三个编辑框内可以填充要注册的称号修为流派然后右侧是一个下拉框可以下拉选择进入蛊界的初始蛊虫下面有一个注册按钮当用户填充完信息之后就可以点击注册按钮进行注册其实对于这种风格的开发图形化界面的程序的方式已经十分古老了类似的虽然小编不会讲解这种风格的方式但是其实我们其中有的人也见过这种东西例如文曲星文曲星的主要作用是充当一个电子词典由于手动使用整本的英汉字典进行翻阅查找英语单词效率较低所以使用文曲星的键盘直接进行输入英语单词进行查找的效率较高并且还支持发音同样的上图的右上角中的选项中有娱乐也就意味着可以玩游戏并且还提供了一个开发平台(LAVA)很多的开发者基于这个LAVA平台开发了很多程序也包括很多的游戏同样的还有一些复杂的rpg角色扮演类的游戏仙剑奇侠传也有被移植到这个平台上那么总体来看我们看文曲星的界面显示比较粗糙类似于画出来的是通过画一些点线矩形以及文字显示等的集合那么随着不断的开发以及开发经验的积累后来控件这样的概念就被引入了那么早期的控件比较简单数量也比较有限与之类似的早期的HTML提供的原生控件那么对于HTML来讲其中就包含有很多的标签使用不同的标签就会有不同的效果同样的我们也可以将标签类比成Qt中的控件img// 图片a// 链接input// 输入键button// 按钮所以如上就是早期的网页使用标签进行图片的插入链接的插入输入框的设置按钮的设置布局的调整等我们整体来看仍然的相对粗糙的那么再后来随着时代的发展新的GUI开发体系越来越丰富提供的控件的数量质量越来越提升了// Element的官方文档 https://element.eleme.cn/#/zh-CN/component/button那么新的GUI开发体系例如Element是一个开发前端页面的一个知名界面框架是属于一个比较现代化的控件体系了我们来看上面的Button按钮的种类和显示效果都大幅的提升然而Qt的控件虽然很多但是整体来看颜值还是要比更现代的控件体系要逊色一筹那么在Qt Designer中显示的控件都是默认的样子而Qt中还提供的一些优化手段可以让控件变得更好看类似于给控件化妆整容提升控件颜值我们要知道Qt是十分有活力的并且随着时代的发展在不断的进化Qt近几年还提供了Qt Design Studio可以对标现代化的界面体系并且制作出来的界面的美观程度就是业界内最领先的一档而小编主要讲解的是Qt Creator所以对于Qt Design Studio小编是暂时不进行讲解的感兴趣的读者友友可以自行了解一下而我们学习Qt是为了开发图形化界面的程序那么对于界面的颜值还是很重要的一件事但是我们是搞技术的对于界面的颜值审美这一块会有专门的美工来提供方案我们的工作也就是对照这个方案进行实现图形化界面的程序即可二、QWidget的enable属性铺垫知识那么我们要知道Qt中的各种控件都是继承自QWidget类即QWidget中的各种属性信号函数槽函数成员函数方法等都是被各个Qt内置控件中可以使用的即QWidget类是Qt控件体系中最通用的一部分所以我们要学习Qt中的各种控件就要先学习QWidget类那么此时我们点击ui文件进入Qt Designer此时我们点击右上角的QWidget所以右下角的黄色区域就会显示QWidget的各种属性并且在这里我们也可以直接进行编辑并且上述这些属性也都可以通过Qt的官方文档来进行逐一的学习了解而对于我们来讲我们并不需要对于QWidget的每一个属性都进行了解只需要认识其中一些常用的重要的属性即可并且我们还要知道一个重要的点对于Qt的内置控件都是继承自QWidget那么也就意味着Qt内置的控件也会继承QWidget的属性所以我们学习了QWidget的属性那么对于Qt内置的控件来讲这些属性同样可以适用enable属性理论讲解所以如上首先我们来学习QWidget属性中的enabled这个属性enabled描述了一个控件是否处于可用状态那么与可用相对的概念就是禁用状态如果enabled的值被设置为true那么就是可用如果enabled的值被设置为false那么就是禁用所以我们该如何理解禁用呢如下1所谓的禁用是指该控件不能接收任何用户的输入事件并且在外观上往往是灰色的2如果一个widget被禁用那么widget的子元素也被禁用我们知道widget是要被挂接到对象树上的那么基于widget这个界面中会有很多的控件这些控件同样要被挂接到对象树上的并且这些控件的父元素/祖宗元素都是widget所以一旦widget被禁用那么这些处于widget这个界面中的子控件/子元素也都要被禁用isEnabledsetEnabled那么Qt中基于enable提供了两个API分别是isEnabled和setEnabled那么Qt中对于函数名的命名风格是很优秀的所以我们也就可以从函数名的字面意思上获悉这个函数是干什么的1isEnabled用于获取到控件的可用状态那么如果isEnabled的返回值为true表示控件可用如果isEnabled的返回值为false那么表示控件不可用即禁用2setEnabled用于设置控件是否可用进行传参如果传参true那么就可以设置控件可用如果传参false那么就可以设置控件不可用即禁用控件默认情况下控件被创建出来的初始enabled为true即控件被创建出来初始的时候是可用的代码实现一此时经过小编上面概念讲解我们对于enabled以及对应的两个函数isEnabled和setEnabled已经有了一个基本的认识所以下面我们就来使用代码实现一下获取并设置enabled的属性所以此时我们创建一个项目名为QWidget_1基类为QWidget派生类为Widget的项目#includewidget.h#includeui_widget.h#includeQDebug#includeQPushButtonWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);QPushButton*buttonnewQPushButton(this);button-setText(按钮);button-move(200,200);connect(button,QPushButton::clicked,this,Widget::handle);}Widget::~Widget(){deleteui;}voidWidget::handle(){qDebug()handle;}那么接下来我们先实现一个可以点击按钮打印handle日志的程序那么如上我们在Widget.cpp中Widget的构造函数中进行编码先创建一个按钮button然后设置文本为按钮接下来使用move移动到适当位置来进行信号函数clicked和槽函数handle的关联即可那么对于槽函数我们在Widget.h中声明handle然后在Widget.cpp中进行槽函数handle的定义即可那么实现槽函数handle也很简单使用qDebug()打印日志handle即可运行结果如下无误所以如上此时我们点击GUI上的按钮此时就可以打印handle日志了那么小编小编这和enabled属性有什么关系呢所以此时如下#includewidget.h#includeui_widget.h#includeQDebug#includeQPushButtonWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);QPushButton*buttonnewQPushButton(this);button-setText(按钮);button-move(200,200);connect(button,QPushButton::clicked,this,Widget::handle);button-setEnabled(false);}Widget::~Widget(){deleteui;}voidWidget::handle(){qDebug()handle;}而我们知道setEnabled可以设置一个控件即按钮为禁用状态并且这个按钮在外观上还会变成灰色的所以此时小编当按钮对应的信号函数和槽函数连接之后那么我们使用按钮调用setEnabled传参false所以此时按钮就会变成禁用状态并且按钮在外观上就会变成灰色的运行结果如下所以如上当程序运行后此时按钮变成了禁用状态并且按钮在外观上就会变成灰色的所以小编无论如何使用鼠标进行点击都没有对应日志handle的打印了那么有的读者友友可能会想小编小编你要是骗我怎么办你是不是仅仅是把鼠标放上去没有进行点击那么这里小编目前的表情应该是上面这个表情包了读者友友可以根据小编讲解的原理去实现一下自己点击一下就可以验证出来了这里我们不做过多纠结代码实现二可是小编你不是说和enabled相关的有两个函数isEnabled和setEnabled吗你现在仅仅给我们演示了setEnabled对于isEnabled呢所以接下来我们就将isEnabled和setEnabled结合起来进行讲解去实现一个界面上有两个按钮按钮1用于点击之后打印日志按钮2点击之后可以切换按钮1的enabled的可用状态所以此时我们就创建一个项目名为QWidget_2基类为QWidget派生类为Widget的项目所以此时我们就点击项目的ui文件进入Qt Designer拖拽左侧的按钮控件Push Button拖拽两次并且调整合适的大小那么第一个的按钮的文本命名为按钮第二个按钮的文本命名为切换可用状态那么在同一个界面中要求不同控件的objectName也是必须不同的不能重复由于不同不重复的特性所以使用ui-objectName的方式可以唯一的获取到控件对象1使用ui-pushButton可以获取第一个按钮对应的对象2使用ui-pushButton_2可以获取第二个按钮对应的对象这种调用的原理就是元编程Qt会根据ui文件生成一个ui_widget.h的文件那么在生成过程中就可以感知到界面上都有哪些控件以及每个控件的objectName是什么所以此时就会以控件对应的objectName的值命名控件对象而我们观察当前自动生成的objectName是有规律的这个名字就是根据控件的类型加下划线加数字的方式命名的但是实际上结尾以数字的方式命名不是一个好的编程习惯我们更期望对象的命名更能直观的看出这个对象的作用等信息的所以此时我们点击切换可用状态的按钮此时右侧黄色的区域就可以直接编辑这个控件的属性所以我们将objectName修改从pushButton_2修改为pushButton_enable即从命名上我们就可以看出这个控件是和enable有关的这样的命名也更为规范那么对于按钮这个按钮那么我们就使用Qt默认生成的pushButton即可所以此时我们右击按钮然后点击传到槽那么我们总览一下按钮提供的信号函数还是挺多的那么我们要进行关注的信号函数是clicked那么对于clicked信号有两个版本即无参的clicked和参数为bool的clicked对于按钮来讲那么参数为bool的clicked表示是否被勾选这个东西来讲对于复选框QCheckBox以及单选框QRadioButton有意义那么对于QpushButton来讲并没有意义所以clicked信号函数的两个版本对于QPushButton来讲QPushButton按钮使用无参的clicked即可所以对于Qt Designer中的两个按钮我们都进行右击然后点击转到槽点击无参的clicked即可让Qt帮我们自动生成槽函数的声明和定义#ifndefWIDGET_H#defineWIDGET_H#includeQWidgetQT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACEclassWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parentnullptr);~Widget();privateslots:voidon_pushButton_clicked();voidon_pushButton_enable_clicked();private:Ui::Widget*ui;};#endif// WIDGET_H#includewidget.h#includeui_widget.h#includeQDebugWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);}Widget::~Widget(){deleteui;}voidWidget::on_pushButton_clicked(){qDebug()执行了槽函数;}voidWidget::on_pushButton_enable_clicked(){boolenableui-pushButton-isEnabled();if(enabletrue){ui-pushButton-setEnabled(false);}else{ui-pushButton-setEnabled(true);}}所以对于槽函数on_pushButton_clicked那么我们打印日志执行了槽函数即可对于槽函数on_pushButton_enable_clicked那么我们先使用isEnabled获取到按钮的enabled状态并且保存在bool类型的对象enable中接下来进行判断1如果enable为true那么代表此时按钮可用而on_pushButton_enable_clicked要实现的是切换可用状态所以我们就调用setEnable传参false将按钮的可用状态切换为禁用状态即可2如果enable为false那么代表此时按钮禁用而on_pushButton_enable_clicked要实现的是切换可用状态所以我们就调用setEnable传参true将按钮的可用状态切换为可用状态即可运行结果如下程序运行那么小编点击按钮可以正常打印日志这是因为按钮被创建出来之后默认的enabled为true即可用状态所以点击按钮触发clicked信号执行关联的槽函数打印日志那么接下来小编点击切换可用状态此时上方按钮的enabled的属性就被切换为了false即此时按钮被禁用了并且外观变成灰色所以此时无论小编如何点击按钮那么此时都不会打印日志了接下来小编再点击切换可用状态此时上方按钮的enabled的属性就被切换为了true即此时按钮可用外观不再是灰色的了所以此时小编点击按钮触发clicked信号就可以执行关联的槽函数打印日志总结以上就是今天的博客内容啦,希望对读者朋友们有帮助水滴石穿坚持就是胜利读者朋友们可以点个关注点赞收藏加关注找到小编不迷路