我正在尝试将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();
});
答案 0 :(得分:1)
错误:没有匹配函数来调用'FileSystemModel :: connect(model_filesystem :: Directory ...
Directory
课程不是QObject
。 如果要使用信号和/或广告位,需要继承QObject
。
从QObject或其子类之一(例如,QWidget)继承的所有类都可以包含信号和插槽。
为了能够在运行时查询插件是否实现给定的接口,我们必须使用Q_DECLARE_INTERFACE()宏。
这似乎在运行时为查询提供了一个机制,是否插件实现了一个给定的接口所以我不明白为什么应该有Directory
类的期望应该像QObject
一样工作而不用继承它。
换句话说,没有子类化QObject
就可以使用它,但这并不能授予Directory
使用信号的能力和/或插槽。
SIGNAL(model_filesystem ::目录::更新())
即使Directory
是QObject
,也没有update
信号,只有changed
和failure
。