向每个对象的实例广播Qt信号



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

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() ;
};

当调用loginlogged()信号被触发,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实例。

有没有标准的方法可以做到这一点?

我不这么认为,因为你本质上是在寻找一种Qt/C++方法来查找特定类的所有实例(在这种情况下Auth)。 例如,请参阅此或此。

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

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

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

最新更新