gpt4 book ai didi

c++ - Qt 如何处理信号和槽的引用调用?

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:32 25 4
gpt4 key购买 nike

我有几个关于信号和槽的问题。我正在使用 Qt 4.8。

  1. 信号和槽必须是 void 函数吗?信号当然不是函数,但它被声明为普通成员函数。

  2. 我经常使用常量引用调用来避免创建过多的对象拷贝。我可以将 call-by-const-reference 用于信号和槽吗?发出信号后,发送的对象可能会超出范围。或者信号是否存储已发送内容的拷贝?那么按常量引用调用将与按值调用相同。

  3. 如果插槽操纵它通过来自发送方的引用调用获得的对象怎么办?发件人是否注意到这一点?

  4. 可以强制信号等待直到连接的插槽完成吗?我该怎么做?

最佳答案

首先,我说的是Qt4连接(可能也适用于Qt5)

Do signals and slots have to be void functions

没有。如果您正常使用,具有返回值的信号和槽都将表现得好像它们是 void 一样。但是插槽 (using as normal function, binding, invoke method of metasystem) 和信号 (receive value from non void slots) 可以有高级用法

Can I use call-by-const-reference with signals and slots?

对qt没有任何意义。但是你仍然强制你的方法不改变它的参数。 Qt 中的连接被设计成数据与某些连接类型一起复制,但 Qt::DirectConnection 除外。程序员应该将按常量引用调用的签名视为传统 qt 连接中按值调用的签名。这是因为排队的连接和线程之间的连接要求对象具有 a public default constructor, a publiccopy constructor and a public destructor .

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 会复制数据。

关于c++ - Qt 如何处理信号和槽的引用调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34432015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com