Qt 如何处理信号和槽的引用调用?
How does Qt handle call-by-reference for signals and slots?
我有几个关于信号和槽的问题。我正在使用 Qt 4.8。
信号和槽必须是 void 函数吗?信号当然不是函数,但它被声明为普通成员函数。
我经常使用常量引用调用来避免创建过多的对象副本。我可以将 call-by-const-reference 用于信号和槽吗?发出信号后,发送的对象可能会超出范围。或者信号是否存储已发送内容的副本?然后按常量引用调用将与按值调用相同。
如果插槽操纵它通过来自发送方的引用调用获得的对象怎么办?发件人注意到了吗?
是否可以强制信号等待直到连接的插槽完成?我该怎么做?
首先,我说的是Qt4连接(可能也适用于Qt5)
Do signals and slots have to be void functions
没有。如果您正常使用,具有 return 值的信号和槽将表现得好像它们是空的。但是插槽可以有高级用法 (using as normal function, binding, invoke method of metasystem) and signals(receive value from non void slots)
Can I use call-by-const-reference with signals and slots?
对于qt来说没有任何意义。但是你仍然强制你的方法不改变它的参数。 Qt 中的连接设计为 数据与某些连接类型一起复制,Qt::DirectConnection 除外。程序员应该将按常量引用调用的签名视为传统 qt 连接中按值调用的签名。这是因为排队的连接和线程之间的连接要求对象具有 a public 默认构造函数,a public
复制构造函数和一个 public 析构函数.
Qt 使用 implicit data sharing 解决了这个问题。例如,QImage
是一个轻量级对象,它在内部引用真实的像素数据,其大小可以任意大。
What if the slot manipulates the object it got via call-by-reference
from the sender? Does the sender notice this
如上所述通过引用调用将传递对象的副本。该对象首先被复制到函数外部,然后作为引用传递。但是,如果您传递一个与其副本共享数据的对象(例如共享指针,),则对该对象的任何修改都可能影响所有副本。正如 peppe 在评论中指出的那样,大多数时候 Qt 将隐式共享与写时复制相关联。这意味着在QImage的情况下,修改不会影响其他副本。
It is possible to force the signal to wait until the connected slots
have finished? How do I do that?
如果发送方和接收方都在同一个线程中,则使用连接类型 Qt::DirectConnection
,否则 Qt::BlockingQueuedConnection
。
如上所述,const 引用签名意味着 Qt::DirectConnection 不会复制数据,而 Qt::BlockingQueuedConnection 会复制数据。
我有几个关于信号和槽的问题。我正在使用 Qt 4.8。
信号和槽必须是 void 函数吗?信号当然不是函数,但它被声明为普通成员函数。
我经常使用常量引用调用来避免创建过多的对象副本。我可以将 call-by-const-reference 用于信号和槽吗?发出信号后,发送的对象可能会超出范围。或者信号是否存储已发送内容的副本?然后按常量引用调用将与按值调用相同。
如果插槽操纵它通过来自发送方的引用调用获得的对象怎么办?发件人注意到了吗?
是否可以强制信号等待直到连接的插槽完成?我该怎么做?
首先,我说的是Qt4连接(可能也适用于Qt5)
Do signals and slots have to be void functions
没有。如果您正常使用,具有 return 值的信号和槽将表现得好像它们是空的。但是插槽可以有高级用法 (using as normal function, binding, invoke method of metasystem) and signals(receive value from non void slots)
Can I use call-by-const-reference with signals and slots?
对于qt来说没有任何意义。但是你仍然强制你的方法不改变它的参数。 Qt 中的连接设计为 数据与某些连接类型一起复制,Qt::DirectConnection 除外。程序员应该将按常量引用调用的签名视为传统 qt 连接中按值调用的签名。这是因为排队的连接和线程之间的连接要求对象具有 a public 默认构造函数,a public 复制构造函数和一个 public 析构函数.
Qt 使用 implicit data sharing 解决了这个问题。例如,QImage
是一个轻量级对象,它在内部引用真实的像素数据,其大小可以任意大。
What if the slot manipulates the object it got via call-by-reference from the sender? Does the sender notice this
如上所述通过引用调用将传递对象的副本。该对象首先被复制到函数外部,然后作为引用传递。但是,如果您传递一个与其副本共享数据的对象(例如共享指针,),则对该对象的任何修改都可能影响所有副本。正如 peppe 在评论中指出的那样,大多数时候 Qt 将隐式共享与写时复制相关联。这意味着在QImage的情况下,修改不会影响其他副本。
It is possible to force the signal to wait until the connected slots have finished? How do I do that?
如果发送方和接收方都在同一个线程中,则使用连接类型 Qt::DirectConnection
,否则 Qt::BlockingQueuedConnection
。
如上所述,const 引用签名意味着 Qt::DirectConnection 不会复制数据,而 Qt::BlockingQueuedConnection 会复制数据。