[英]Connect QObject interface signal to a lambda Slot
我試圖將QObject信號連接到lambda插槽,但使用指向對象的接口指針,而不是指向具體QObject類的指針。 但是我得到這個奇怪的錯誤:
error: no matching function for call to ‘FileSystemModel::connect(model_filesystem::Directory*&, const char*, FileSystemModel::setDirectory(model_filesystem::Directory*)::<lambda()>)’
});
以下是我的代碼片段:
// Interface declaration
namespace model_filesystem {
class Directory {
public:
virtual ~Directory()
virtual QString name() = 0;
Q_SIGNALS:
void changed();
void failure(QString msg);
};
}
Q_DECLARE_INTERFACE(model_filesystem::Directory, "org.moonlightde.panel.model_filesystem.Directory/1.0")
//Implementation
class GVFSDirectory : public QObject, public model_filesystem::Directory {
Q_OBJECT
Q_INTERFACES(model_filesystem::Directory)
public:
GVFSDirectory(const QString &uri);
GVFSDirectory(GFile * gfile);
virtual ~GVFSDirectory();
virtual QString name();
public Q_SLOTS:
void update();
Q_SIGNALS:
void changed();
void failure(QString msg);
// Usage
Directory * directory = new GVFSDirectory("/");
connect(directory, SIGNAL(model_filesystem::Directory::changed()), [this] () {
setupModel();
});
錯誤:沒有匹配的函數來調用'FileSystemModel :: connect(model_filesystem :: Directory ...
Directory
類不是QObject
。 如果要使用signal和/或slot,它需要將QObject
子類化 。
從Qt5-信號和插槽 :
從QObject或其子類之一(例如QWidget)繼承的所有類都可以包含信號和插槽。
從Qt5-即插即用示例 :
為了能夠在運行時查詢插件是否實現了給定的接口,我們必須使用Q_DECLARE_INTERFACE()宏。
這似乎提供了一種機制,可以在運行時查詢插件是否實現了給定的接口,因此我看不出為什么不應該期望Directory
類像QObject
那樣工作而無需對其進行子類化。
換句話說,可以在不將QObject
子類化的情況下使用它,但這不會授予Directory
使用信號和/或slot的能力。
SIGNAL(model_filesystem ::目錄::更新())
即使Directory
是QObject
,也沒有update
信號,只有changed
和failure
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.