簡體   English   中英

將QObject接口信號連接到Lambda插槽

[英]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 ::目錄::更新())

即使DirectoryQObject ,也沒有update信號,只有changedfailure

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM