转载自:(14条消息) Qt5.9.2+VS2017入门实例——透彻解析_冯爽朗的博客-CSDN博客_vs qt 示例
由于现在书上介绍的大部分都是Qt Creator,并没有介绍Qt+VS的教程,虽然说很相似,但是也有很多地方不同,对于初学者特别是那些槽和信号的连接非常的乱,而且几种文件也傻傻分不清,这个实例就带你理清Qt+VS的创作过程,保证你可以举一反三,会用一些简单控件的添加与事件的触发。
在完成例子之前我先说一下,本例子是用Qt设计师设计界面,不像其他地方直接用代码实现界面的设计。
案例说明:
1.勾选CheckBox可以改变LineEdit里面的文字属性,是只读还是加密显示。
2.点击输入按钮可以将LinEdit里面的文字显示在TextLabel里面。
首先创建新的项目如下图:
这里先简单介绍下解决方案中的文件:
(1)是Qt设计师文件,双击可以打开Qt可视化设计
(2)Qt界面的代码文件,Qt设计师设计的界面以代码的形式存储在这里,比如Button的位置,大小,名字
(3)Widget类的头文件,定义一些字段和函数声明,包括最重要的slots(槽)函数的声明,以及界面ui句柄,以便通过“ui.***”的方式访问到界面的各个控件,比如访问界面的Label控件里的文字可以这样:ui.label->text();就是字面意思,很容易理解。
(4)资源文件,相当于AndroidStudio里面的rcs文件夹,里面存放需要用到的.ico图标或者图片。
(5)主函数文件,程序的入口,不必解释,其实一般不会在这个里面修改什么。
(6)Widget类完成的主要文件,在widget.h里面定义之后的字段以及函数声明,以及槽的实现,都是在这里,Qt的逻辑功能设计主要是修改这个文件。
然后设计界面——拖放控件:
双击.ui文件,打开Qt设计师,在设计师的左边控件区域找到下面几个控件:
1. Check Box(2个)
2.PushButon
3. LineEdit
4.TextLabel
左键按下拖动到界面上,布局如图所示,双击界面上的控件,改变他们显示的名字,(控件有两个名字:1,显示时的名字(text),2,设计时需要调用它时的名字(objectName),一般是英文和数字组合。
现在开始本篇博客的重头戏,信号与槽的链接。
1、先添加事件发现的函数——槽函数。
因为我们有三个动作(事件),其中有一个是按钮按下的动作(事件),还有两个分别是两个CheckBox勾选后的动作(事件),这些动作发生之后都要执行相对应的任务。所以先添加这些事件函数,slots是槽的意思,在widget.h文件中添加。
#pragma once
#include <QtWidgets/QWidget>
#include "ui_widget.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = Q_NULLPTR);
private:
Ui::WidgetClass ui;
private slots:
void on_checkBox_clicked();
void on_checkBox_2_clicked();
}
需要注意的是这些函数是有命名规则的,"on_"后面是控件的设计名字(objectName),然后后面是“_clicked()”,你在设计的时候最好遵循这种命名格式,这样你就可以省掉2的步骤(连接信号与槽),也就是说,你如果遵循这个命名格式的话你就不用写connect()函数了,因为这种定义让系统能够自动识别信号与槽的连接,不用再写connect()函数,可以直接到第3步(槽函数的实现),但是如果系统比较复杂,并不是所有的都可以这样命名的时候,你就要用到2的步骤了。
2、连接信号与槽
如果你在1中没有按照命名规则来命名槽函数,那么就要进行信号与槽的连接,所谓信号与槽的连接就是,一个事件触发会发送出一个信号,要有一个相应的槽接收这个信号,然后执行相应任务。这个过程需要连接的,如果不设计这个连接,即使事件触发,Button send出一个click信号,也没有什么东西去执行click后的任务。
那么怎么进行连接呢,在widget.cpp里添加:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
connect(ui.checkBox,SIGNAL(clicked()),this,SLOT(on_checkBox_clicked()));
connect(ui.checkBox_2, SIGNAL(clicked()), this, SLOT(on_checkBox_2_clicked()));
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
}
可以很容易看出,ui中的checkBox发出一个clicked()的信号,on_checkBox_clicked()槽函数去接收它,在这里我用的是正规的命名规则,其实是不需要写connect()函数的,这里使用connect函数是进行示范用。
必杀技:
必杀技终于来了,有没有感觉这样手动写connect()函数很蛋疼,写完一个槽函数也就算了,还要我自己写信号与槽的连接,如果多的话,我岂不一个个写要累死,所以用到Qt设计师的时候到了:
双击widget.ui文件打开设计师,如下步骤进行:
如上图,点击1处的信号与槽按钮,然后先为“只读”checkbox添加信号与槽的连接,方法就是鼠标左键拖动“只读”按钮到空白区域,松开鼠标会弹出信号与槽的对话框,如下图:
如上图:首先选择2处的信号(clicked(),对应步骤2的手动写connect()就可以明白),然后点击3处的编辑以便添加槽,如下图:
如上图:点击1处的加号,会在2处出现slot1(),这个是默认的,所以把slot1()改成你自己需要的槽,“只读”check Box对应的槽应该是on_checkBox_clicked(),(注意这里我用的也是正规命名规则,正规命名规则是不需要添加槽和信号的连接的,我这里只是做示范用),添加之后点击下面的ok,然后进行下一步:
如上图:你就完成了一个复选框的信号与槽的连接了,clicked()是信号,on_checkBox_clicked()是槽,接下来按照同样的方法进行其他两个控件的信号与槽的连接就可以了。
3、widegt.cpp的修改——槽函数的任务执行
无论你是利用哪一种方式连接信号与槽的,都需要看这一步,这一步也是最重要的一步,也就是点击按钮之后,功能的实现,现在只剩下如何完成点击之后的功能了,所以要补全槽函数的内部,你要知道,我们在4.1中添加的槽函数是在widget.h这个头文件中添加的,这个叫做声明,所有我们要补全它,当然是在其对应的widget.cpp文件中补全,可能会遇到一些问题,请参考下面的“补充”解决,代码如下:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
void Widget::on_checkBox_clicked()
{
if (ui.checkBox->isChecked())
{
ui.lineEdit->setReadOnly(true);
}
else
{
ui.lineEdit->setReadOnly(false);
}
}
void Widget::on_checkBox_2_clicked()
{
if (ui.checkBox_2->isChecked())
{
ui.lineEdit->setEchoMode(QLineEdit::Password);
}
else
{
ui.lineEdit->setEchoMode(QLineEdit::Normal);
}
}
void Widget::on_pushButton_clicked()
{
ui.label->setText(ui.lineEdit->text());
}
首先要包括widget.h这个头文件,因为这里用到的函数与句柄都是在widget.h里定义的,其中有一个ui句柄,就是在指整个界面,你可以通过这个ui访问界面上的控件(可能会出现ui_widget.h找不到或打不开问题,看下面的补充),解释一下第一个槽函数里的内容:
ui.checkBox->isChecked():指的是ui界面上的checkBox控件被勾选,返回的是一个bool型,很容易理解,被勾选就是true,否则就是false.
然后看里面的ui.lineEdit->setReadOnly(true):ui界面上的lineEdit控件设置成只读属性,或者不是只读属性。就这么简单。
其实设计师中完成的信号与槽的连接也是通过代码实现的,只是我们通过设计师自己添加的时候,代码已经默默的生成connect()函数了,不信的话你可以到ui_widget.h文件里面找到retranslateUi(WidgetClass);看看下面的代码是不是connect()函数,哈哈,是的!
总结:
当一个事件触发时,会发出一个信号,信号与槽链接后,由相应的槽函数接收这个信号执行相应的动作。其中信号与槽的链接主要有3种方法,其一,按照规范命名,系统会自动进行链接,其二,在构造函数中利用connect函数进行链接,其三,利用Qt Desginer编辑信号与槽。因此,完成一个事件的触发要历经3个步骤,添加槽函数,链接信号与槽,实现槽函数。
补充:
可能在你修改widget.cpp文件时就会发现ui_widget.h文件打不开,无法用到输入提示(比如你在widget.cpp文件中输出“ui.”的时候后面不会出现提示的单词,那是因为你的ui_widget.h文件没有被识别),你可以将ui_widget.h文件右键->移除,然后重新添加就可以了!