将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
。如果要使用信号和/或插槽,则需要子类化QObject
。
来自Qt5-信号&插槽:
所有继承自QObject或其子类之一(例如,QWidget)的类都可以包含信号和槽。
来自Qt5-即插即用;油漆示例:
为了能够在运行时查询插件是否实现了给定的接口,我们必须使用Q_DECLARE_interface()宏。
这似乎为在运行时查询插件是否实现给定接口提供了机制,所以我不明白为什么应该期望Directory
类像QObject
一样工作而不进行子类化。
换句话说,在不将QObject
子类化的情况下使用它是可以的,但这不会授予Directory
使用信号和/或插槽的能力。
SIGNAL(模型文件系统::目录::更新())
即使Directory
是QObject
,也没有update
信号,只有changed
和failure
。
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- 在Qt中使用C++Lambda函数作为插槽是否有助于保持库的二进制兼容性?
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C / QT中lambda函数中的paramater插槽
- BOOST :: SIGNALS2带有Lambda表达式的SIGNALS2插槽使用ARM32上的GCC6失败
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- 在 for 循环中使用 lambda 函数连接信号插槽
- 将QObject接口信号连接到lambda插槽
- lambda(块)插槽通过Qt中的Objective-c
- 将QML信号连接到c++ 11 lambda插槽(Qt 5)