QTqt 信号槽连接的槽函数是否有调用的顺序

信号和槽使用时各种函数的实际调用顺序
信号和槽使用时各种函数的实际调用顺序
linux C++开发
&&& 信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。
&&& 所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。
使用自定义的信号和槽,需要注意以下几点:
1、类的声明和实现分别放在.h和.cpp文件中;
2、类声明中包含Q_OBJECT宏;
3、信号只要声明不要设计其的实现函数;
4、发射信号用emit关键字;
5、自定义槽的实现与普通成员函数的实现一样。
&&& 当程序中所使用的类中具有用户自定义的槽和信号时,你需要使用moc(元对象编译器)对程序进行编译。
编译方法一:
你可以将moc文件编译为目标文件,之后把它与ClassDefinion.cpp和main.cpp一起链接,下面具体的操作步骤:
#moc&ClassDeclaration.h&-o&ClassDeclaration.cpp& &#g++&-c&ClassDeclaration.cpp&-o&ClassDeclaration.o& &#g++&-c&ClassDefinion.cpp&-o&ClassDefinion.o& &#g++&-c&main.cpp&-o&main.o& &#g++&-lqt&ClassDefinion.o&ClassDeclaration.o&main.o&-o&MyProgram&&
编译方法二:
创建一个空的文件夹,把源文件ClassDeclaration.h,ClassDefinion.cpp和main.cpp放入其中,执行以下命令:
#qmake&-project& &#qmake& &#make&&
完成上述步骤后,就生成可执行文件了(可执行文件的名与你所创建的文件夹的名称相同),我们就可以运行它了。
创建用户自定义的信号与槽的具体步骤:
首先你需要在类声明中声明自定义的信号和槽。在关键字public slots:下声明自定义槽;在signals:关键字下声明自定义的信号。如下例所示:
class&MyMainWindow&:&public&QWidget& &{& & Q_OBJECT& &public:& &void&MyMainWindow();& &void&SetValue(int);& &signals:& &void&ValueChanged(int);& &public&slots:& &void&ChangeValue(int);& &};&&
正如你可能猜想到的,只有当一个新的值传递给SetValue()函数时,SetValue()函数才应该调用ValueChanged()信号。之后,通过将ValueChanged()信号连接到ChangeValue()槽,使得当有新值传递给SetValue()函数时,能够引起数值的变化。多数情况下,这是不必要的,但它演示了信号的使用方法。SetValue()函数可以像下面格式实现:
void&MyMainWindow::SetValue(int&value)& &{& & if(value!=oldvalue)& &{& & oldvalue=& &emit&ValueChanged(value);& &}& & }&&
如你看到的只有,当新值与旧值不同时才发射ValueChanged()信号,且oldvalue将被修改为value。应注意的是,信号与槽一类的普通函数不同,它只能使用emit关键字发射。ChangeValue()可定义为:
void&MyMainWindow::ChangeValue(int&value)& &{& & FunctionForChangingTheValue(value);& &}&&
在这段代码中,调用 FunctionForChangingTheValue( )函数去修改数据。你需要做的最后一件事是将信号和槽连接起来:
connect(this,SIGNAL(ValueChanged(int)),this,SLOT(ChangeValue(int)));&&
这个例子的功能是当调用SetValue()函数时,检查新值是否等于旧值。如果不等,则发射ValueChanged()信号,又因为 ValueChanged()信号被连接到ChangeValue槽,因此当发射ValueChanged()信号时将执行ChangeValue()槽。之后,ChangeValue()槽调用FunctionForChangingTheValue()函数去修改实际数据。
【编辑推荐】
1. 一个信号和多个槽函数相关联时,当信号被发出时,与之相关联的槽函数被激活的顺序是随机的。
我的热门文章
即使是一小步也想与你分享函数原型:
QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)
通常使用的connect,实际上最后一个参数使用的是Qt::AutoConnection类型:Qt支持6种连接方式,其中3中最主要:
1.Qt::DirectConnection(直连方式)(信号与槽函数关系类似于函数调用,同步执行)
&&&&&&& 当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。
2.Qt::QueuedConnection(排队方式)(此时信号被塞到信号队列里了,信号与槽函数关系类似于消息通信,异步执行)
&&&&&&& 当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。
3.Qt::AutoConnection(自动方式)
&&&&&&& Qt的默认连接方式,如果信号的发出和接收这个信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与排队方式相同。
4.Qt::BlockingQueuedConnection(信号和槽必须在不同的线程中,否则就产生死锁)
&&&&&&& 这个是完全同步队列只有槽线程执行完成才会返回,否则发送线程也会一直等待,相当于是不同的线程可以同步起来执行。
5.Qt::UniqueConnection
&&&&&&& 与默认工作方式相同,只是不能重复连接相同的信号和槽,因为如果重复连接就会导致一个信号发出,对应槽函数就会执行多次。
6.Qt::AutoCompatConnection
&&&&&&& 是为了连接Qt4与Qt3的信号槽机制兼容方式,工作方式与Qt::AutoConnection一样。
如果这个参数不设置的话,默认表示的是那种方式呢?
&&&&&&& 没加的话与直连方式相同:当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。在这个线程内是顺序执行、同步的,但是与其它线程之间肯定是异步的了。如果使用多线程,仍然需要手动同步。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6024次
排名:千里之外
(1)(2)(1)(1)(1)(4)2016年7月 移动开发大版内专家分月排行榜第二2016年1月 移动开发大版内专家分月排行榜第二2015年12月 移动开发大版内专家分月排行榜第二2015年10月 移动开发大版内专家分月排行榜第二
2015年11月 移动开发大版内专家分月排行榜第三
2016年7月 移动开发大版内专家分月排行榜第二2016年1月 移动开发大版内专家分月排行榜第二2015年12月 移动开发大版内专家分月排行榜第二2015年10月 移动开发大版内专家分月排行榜第二
2015年11月 移动开发大版内专家分月排行榜第三
2016年7月 移动开发大版内专家分月排行榜第二2016年1月 移动开发大版内专家分月排行榜第二2015年12月 移动开发大版内专家分月排行榜第二2015年10月 移动开发大版内专家分月排行榜第二
2015年11月 移动开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多关于 qt信号和槽 参数传递 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信