【问题标题】:Can I access Qt signals/slots of objects out of scope?我可以访问超出范围的对象的 Qt 信号/插槽吗?
【发布时间】:2010-11-14 04:53:09
【问题描述】:

Qt 信号/槽是否遵循原生 C++ 的范围?

假设我有以下课程:House、Kitchen、Cellar、StoveShelf

class House   {Kitchen kitchen, Cellar cellar;};
class Kitchen {Stove stove;};
class Cellar  {Shelf shelf;};

现在我想从地窖的架子上向厨房的炉子发送一个信号。唯一的方法是通过将信号从架子连接到地窖和从厨房连接到炉子的插槽,然后在室内连接地窖和厨房?或者有没有办法直接做到这一点?

我有一个需要与用户界面通信的类,我想知道我是否需要通过中间类“代理”所有各种信号/插槽。或者这是否表明设计不佳?

【问题讨论】:

  • 如果有人用对您有帮助的答案回答了您的问题,请将其标记为正确答案。

标签: c++ qt scope signals-slots


【解决方案1】:

您可以在 House 的任何方法中进行连接,因为您可以访问这两个对象。 “连接器”必须能够在编译时访问发送者和接收者,仅此而已。

【讨论】:

    【解决方案2】:

    您应该能够将信号从 Shelf 实例链接到 Stove 实例

    在房子里,

    connect(cellar->shelf,SIGNAL(signalHere()),kitchen->stove,SLOT(slotHere()));

    只要确保 shelfstoveKitchenCellar 中的公共变量,您就会被设置

    【讨论】:

    • @problemofficer:他回答了你的问题“有没有办法直接做到这一点?”。是的,您可以通过使子对象可访问来直接执行此操作。您可以通过将它们公开、声明友元类、编写返回指针或引用的函数等来做到这一点。
    • @problemofficer:由于架子和炉子不公开,您必须做更多的工作来设置连接。您需要设置 2 个信号的连接,一个从室内的信号到厨房的信号,一个从厨房的信号到炉子的插槽。架子和地窖也是如此。一个例子...房子connect(this,SIGNAL(recievedSignalFromCellar()),kitchen,SIGNAL(send2Stove()));厨房connect(this,SIGNAL(send2Stove()),shelf,SLOT(passedThroughKitchen()));
    • 整个链条将是一系列连接信号(架子)->信号(地窖)->信号(房子)->信号(厨房)->槽(炉)。它只是许多方法中的一种......
    【解决方案3】:

    您不能在没有 QObjects 的类上使用信号/插槽,所以不,您的示例将无法正常工作。

    如果你用它们的父对象初始化子对象,你可以绕过封装,所以你可以做dirty技巧,比如:connect(this->shelf, SIGNAL(signalHere()), kitchen->children()[0], SLOT(aStoveSlot()))。但是,这只有在 Kitchen 的第一个孩子确实是 Stove 时才有效...因此,由于这是一个明显的依赖关系,因此您应该通过公开火炉或添加火炉访问器方法来使其可见。

    【讨论】:

    • 这只是一个例子。实际的类将继承 QObject。不过谢谢你的肮脏把戏。
    • 不过,我认为这一澄清很重要。
    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2010-12-11
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多