还在为头脑简单看不懂代码而发愁吗?还在为思想浅薄只会人云亦云、拾人牙慧、鹦鹉学舌而遭人鄙夷吗?
《教你写代码》,从另一维度解读代码,让你成为见解独特的黑马观众。

教你学Qt桌面端开发栏目旨在帮助有一些基础,但仍停留在理论阶段、尚未入行或正在入行的同学如何快速高效地学习掌握Qt桌面端开发的关键技巧,既不适用于完全不懂C++的小白萌新,也不适用于完全懂了想要进一步提升自我。本栏目尽量少说或者不说具体模块,思考为主,实例为辅。

注:本文所有桌面端开发的教程都默认在Windows环境下使用Visual Studio开发。这是全宇宙最好的IDE,先相信,后相信。

【教你学Qt桌面端开发】pt1:浅谈Qt:特色C++主义类库

看到这里,C++学过的东西就不再重复了,只是聊聊在Qt中能给你在开发中带来哪些特点,和c++有什么不一样的地方,在后面的文章中就不再讨论这些了,默认看过都懂哈。

1.信号槽机制

信号槽机制是一个类似Windows消息机制的交互方案,比回调函数使用更简单方便,但效率不如回调函数的机制。我在实际的使用过程中感觉它更像是类似C#里的委托事件一样,效率虽比回调函数有几何倍的损失,但胜在调用方便,使用简洁灵活,不用在那种对时间精度要求较高或者并发量较大的软件系统内都是可以接受的。

Qt内部几乎所有的事件传递都是通过这个信号槽来进行的,比如Ui上的交互事件(比如点击按钮,文字改变等等)、网络事件(TCP连接等)、COM组件交互(COM事件)等等模块基本上都是这样的。

我们来看看信号槽的绑定方法:

//注:params指代参数组
QObject::connect(object1,SIGNAL(signal_object1(params)),object2,SLOT(slot_object2(params)));

信号槽是通过QObject的静态函数connect进行绑定的,也就是说信号槽只会在继承了QObject的类上生效,非QObject的类(Qt中会有一些非QObject的类)中是无法使用信号槽的,这点需要注意!后续不再使用这个形式,让我们回到函数

connect(object1,SIGNAL(signal_object1(params)),object2,SLOT(slot_object2(params)));

connect中,有四个参数,一般习惯上我们把触发方放在左边,把被接收方放在右边, 这段代码的意思就是:object1发出了信号signal_object(params),触发了object2的槽函数slot_object2(parmas)

信号函数和槽函数要怎么定义:

1.信号函数
只需要一个signals:关键字,不需要public private修饰,也不需要写函数实现,只需要声明出来。
【教你学Qt桌面端开发】pt1:浅谈Qt:特色C++主义类库-小白菜博客
在需要触发这个signals信号的地方通过emit signal_object1(int)的方式调用即可,如图所示
image

这样就可以把这个信号发送出去了,接下来说槽函数

2.槽函数

槽函数的话需要声明可见类型,比如public slots,private slots等等,这个仅代表可见类型。比如我们可以在头文件中这样声明:

【教你学Qt桌面端开发】pt1:浅谈Qt:特色C++主义类库-小白菜博客
注意,所有的槽函数一经声明就必须要写出实现,否则会出现LNK2019错误。

举个例子

比如我们写个例子,就拿按钮举例吧,

image

就像我们之前说的,UI中的很多交互是通过信号槽进行的,这里我可以告诉你这里按钮就提供了一些信号,比如这个按钮的点击事件就叫clicked,我们可以先记下,怎么找的我之后再说。

那我们来写个简单的槽函数,头文件里的声明就不写了。

void QtWidgetsApplication2::slot_object1()
{
	//触发槽函数就会给textEdit中添加一行114514!
	for(int i = 0;i<9;++i){
	this->ui.textEdit->append("114514!");
	}
}

ok,那么我们现在来绑定一下,我们就是要把这个按钮的点击信号绑定到这个槽函数slot_object1上,我们这样绑定:

connect(this->ui.pushButton,SIGNAL(clicked()),this,SLOT(slot_object1()));

ok那么现在这个点击按钮,也就是这个ui.pushButton的clicked信号也就和这个slot_object1绑定起来了,现在点击这个按钮的时候,这个slot_object就会触发了

如果没有触发,那么就要考虑一下你的connect是不是有问题了,可以尝试输出一下你的connect结果、检查一下你的槽函数格式是否正确,检查信号是否顺利发出。当然咯这个你都得自己去检查

ok那么简单的信号槽调用写完了,但是这样太麻烦了,有没有什么更简单的方法去调用呢?

UI控件的默认槽函数

我们知道像按钮有click,lineEdit有类似TextChanged等信号函数,那有没有什么比较方便的方法让我们直接调用呢?当然是有的。这就是qt提供的默认槽函数。格式是

void on_控件名_信号名(参数)

比如我们常用的:

public slots:
void on_pushButton_clicked(){
...
}

当我们点击这个按钮的时候,这个槽函数也会被触发,这是由编译器提供的方法,比较简单,在对空间的槽函数要求精度没有那么高的情况下,这样去调用UI控件是比较好的,至于你说别的事件和信号怎么找,部分靠积累,大部分在网上都可以搜得到,这里不过多细聊这个话题。