将QObject接口信号连接到lambda插槽

Connect QObject interface signal to a lambda Slot

本文关键字:lambda 插槽 连接 信号 QObject 接口      更新时间:2023-10-16

我试图将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。如果要使用信号和/或插槽,则需要子类化QObject

来自Qt5-信号&插槽:

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

来自Qt5-即插即用;油漆示例:

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

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

换句话说,在不将QObject子类化的情况下使用它是可以的,但这不会授予Directory使用信号和/或插槽的能力。

SIGNAL(模型文件系统::目录::更新())

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