将QObject接口信号连接到lambda Slot

时间:2015-04-24 03:12:04

标签: c++ qt c++11 lambda

我正在尝试将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();
});

1 个答案:

答案 0 :(得分:1)

  

错误:没有匹配函数来调用'FileSystemModel :: connect(model_filesystem :: Directory ...

Directory课程不是QObject如果要使用信号和/或广告位需要继承QObject

来自Qt5 - Signals & Slots

  

从QObject或其子类之一(例如,QWidget)继承的所有类都可以包含信号和插槽。

来自Qt5 - Plug & Paint Example

  

为了能够在运行时查询插件是否实现给定的接口,我们必须使用Q_DECLARE_INTERFACE()宏。

这似乎在运行时为查询提供了一个机制,是否插件实现了一个给定的接口所以我不明白为什么应该有Directory类的期望应该像QObject一样工作而不用继承它。

换句话说,没有子类化QObject就可以使用它,但这并不能授予Directory使用信号的能力和/或插槽

  

SIGNAL(model_filesystem ::目录::更新())

即使DirectoryQObject,也没有update信号,只有changedfailure