Qt信号与槽函数问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt信号与槽函数问题相关的知识,希望对你有一定的参考价值。
参考技术A 进程肯定不会产生了。Qt的信号槽是个很复杂的机制,哥大致给你介绍一下Qt的信号槽既可以同步触发,也可以异步触发。当你进行connect的时候,实际上还有第五个参数(可以自己看SDK的介绍)。如果说是默认的,那么要看信号和槽是否属于同一个线程(这里,你可以简单理解为是否是同一个类),然后根据connect的第五个属性来判断是否是同步还是异步。比如BlockingQueuedConnection模式,就会出现你说的多次触发信号阻塞问题,他只有等到上一个触发完成才能继续。槽函数不会产生新线程,他是决定了槽函数声明在哪个线程中,如果默认情况下,在同一个线程里面是同步的,你此时可以理解为普通调用,如果在不同线程里面,槽函数运行的线程通常是异步调用,但是还有一个所谓的事件中心一直run着在处理,就是一个信号队列,没触发一个信号就入队列,先进先出。本回答被提问者采纳怎么理解QT中的信号与槽
这个问题困扰我很久了。麻烦说的清楚点。我知道槽函数是对信号的响应,槽函数是自己定义的。但是我的问题是:信号也是自己定义的吗?而且为什么发射信号是在槽函数中了?class Foo : public QObject
Q_OBJECT
public:
Foo();
int value() const return val;
public slots:
void setValue( int );
signals:
void valueChanged( int );
private:
int val;
;
void Foo::setValue( int v )
if ( v != val )
val = v;
emit valueChanged(v);
而信号一般是只声明函数体,关键是其参数
信号一般是用来传参或者是一种逻辑的调用者
信号的发射可以在你自定义的函数中
就比如我们继承了一个widget,要重写mousePressEvent
于是我们就可以自己定义一个signal, MyClicked( const QPoint& pos )
然后在事件中emit( MyClicked( event->pos() ) )
不过一般clicked信号是在mouseReleaseEvent中emit的
当然这一切都必须你继承QObject以及声明Q_OBJECT了
而且你也可以把你自己的一些属性property声明至元系统
就是宏Q_PROPERTY(...)
这个其实很有用,举个例子
我们想知道信号发送者的某一个属性
于是我已经Connect了
然后我们就可以在对应的槽中获取
用sender()获取object对象然后调用property来获取发送者的某个属性
还是自己多运用吧
以上都我自己打的阿~ 你还有不会的可以hi我追问
我还是有一些地方不明白,(可能自己太笨了把)信号可以自己定义吗?我可以像调用普通函数那样调用信号吗?
本回答被提问者采纳以上是关于Qt信号与槽函数问题的主要内容,如果未能解决你的问题,请参考以下文章