【问题标题】:Broadcast a Qt signal to every object's instances向每个对象的实例广播 Qt 信号
【发布时间】:2016-05-26 11:25:54
【问题描述】:

我正在寻找一种使用 Qt 进行信号广播的方法。 在我的设计中,我得到了一个 Auth 对象,可以在 c++ 和 qml 端使用:

class Auth : public QObject
{
    Q_OBJECT
public:
    Auth() ;

    Q_INVOKABLE bool isLogged() const ;

    Q_INVOKABLE void reconnect() ;

    Q_INVOKABLE void login(QString mail, QString password) ;

    Q_INVOKABLE void logout() ;

protected:
    static QString token_ ;

signals:
    void error(QString message) ;
    void logged() ;
    void loggedOut() ;
};

login 被调用时,logged() 信号被触发,loggedOut() 信号为logout()

1- 在 qml 部分我有这个代码:

Auth {
    id: auth
    onError: console.log("auth error")
    onLogged: console.log("auth logged")
    onLoggedOut: console.log("auth logged out")
}

2- 在 c++ 方面,我可能会在某些失败情况下这样做:

Auth auth ;
auth.logout() ;

来自 1 和 2 的两个 Auth 对象不相同,因此从一个发出的 loggedOut 不会在另一个中触发,没关系。

现在我想做的是有一种方法可以将loggedOut 信号广播到Auth 的每个实例。我想避免在 C++ 和 qml 端之间共享 Auth 的公共实例。

有标准的方法吗?

【问题讨论】:

    标签: c++ qt qml signals-slots


    【解决方案1】:

    我不这么认为,因为您实际上是在寻找一种 Qt/C++ 方法来查找特定类的所有实例(在本例中为Auth)。参见例如thisthis

    根据许多其他因素,您可以:

    • 维护Auth对象内所有类实例的静态列表,并连接Auth::Auth()内的不同实例
    • 手动将第一个Auth 对象的Auth::loggedOut() 连接到所有其他实例(注意:小心,如果您获得循环连接,您将进入无限循环)。
    • Auth 设为单例(尽管我认为这违反了您的“不共享实例”规定)

    可能还有其他(也许更好)的选择。

    【讨论】:

    • 我实现了第一种方法。我正在考虑切换到第二个,但它们并不严格等价,似乎我将失去将事件触发到特殊实例的能力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2012-02-03
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多