我正在寻找一种用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() ;
};
当调用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
实例。
有没有标准的方法可以做到这一点?
我不这么认为,因为你本质上是在寻找一种Qt/C++方法来查找特定类的所有实例(在这种情况下Auth
)。 例如,请参阅此或此。
根据许多其他因素,您可以:
- 维护
Auth
对象中所有类实例的静态列表,并连接Auth::Auth()
中的不同实例 - 手动将第一个
Auth
对象的Auth::loggedOut()
连接到所有其他实例(注意:请注意,如果您获得循环连接,您将进入无限循环)。 - 使
Auth
成为单例(尽管我认为这违反了您的"不共享实例"规定)
可能还有其他(也许更好)的选择。