首页 文章

Qt如何处理信号和插槽的引用调用?

提问于
浏览
2

我有几个关于信号和插槽的问题 . 我使用的是Qt 4.8 .

  • 信号和插槽是否必须是无效功能?信号当然没有功能,但它被声明为普通的成员函数 .

  • 我经常使用call-by-const-reference来避免创建太多的对象副本 . 我可以使用带有信号和插槽的call-by-const-reference吗?在发出信号后,发送的对象可能超出范围 . 或者信号是否存储了发送内容的副本?然后call-by-const-reference将与call-by-value相同 .

  • 如果插槽通过发件人的引用来操作它所操作的对象怎么办?发件人是否注意到这一点?

  • 可以强制信号等到连接的插槽完成后?我怎么做?

1 回答

  • 2

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

    信号和插槽必须是无效功能

    不会 . 如果您正常使用它们,那么具有返回值的信号和插槽将表现为无效 . 但是可以使用插槽(using as normal function, binding, invoke method of metasystem)和信号(receive value from non void slots)的高级用法

    我可以使用带有信号和插槽的call-by-const-reference吗?

    It means nothing for qt . 但是你仍然强制你的方法不会改变它的参数 . Qt中的连接设计为 data is copied with some connection types, to the exception of Qt::DirectConnection . 一个call-by-const-reference签名应该由程序员完全按照传统qt连接中的值签名调用来处理 . 这是因为线程之间的排队连接和连接要求对象具有a public default constructor, a public copy constructor and a public destructor .

    Qt使用implicit data sharing解决了这个问题 . 例如, QImage 是一个轻量级对象,它在内部引用实际像素数据,其大小可以任意大 .

    如果插槽通过发件人的引用调用操作它所获得的对象怎么办?发件人是否注意到这一点

    如上所述 call by reference will pass a copy of the object . 首先将对象复制到函数外部,然后作为参考传递 . 但是,如果传递与其副本共享数据的对象(例如共享指针),则对该对象的任何修改都可能影响所有副本 . 正如peppe在评论中指出的那样,大部分时间Qt与写入时的复制相关联 . 这意味着在QImage的情况下,修改不会影响其他副本 .

    可以强制信号等待连接的插槽完成?我怎么做?

    如果发送者和接收者都在同一个线程中,则使用连接类型 Qt::DirectConnection ,否则使用 Qt::BlockingQueuedConnection . 如上所述,const引用签名意味着Qt :: DirectConnection不会复制数据,而Qt :: BlockingQueuedConnection将复制数据 .

相关问题