首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QObject事件到非QObject类型

QObject事件到非QObject类型
EN

Stack Overflow用户
提问于 2019-09-15 04:55:58
回答 2查看 483关注 0票数 0

我有一个数据模型对象,它有一个处理Qt事件的方法。但是,当我试图将事件处理程序连接到此方法时,会出现编译时错误。问题是connect模板最终会对第四个参数执行一个static_cast<void (QObject::*)(double)>。由于我的数据模型不是从QObject继承的,所以这段代码会生成错误C2664:

指向的类型是不相关的;转换需要reinterpret_cast、C样式的强制转换或函数类型的转换。

是否有方法将事件处理程序连接到非QObject类型?一个最小的例子是:

代码语言:javascript
复制
struct DataModel {
    void handle(double) { }
};

DataModel data;
QDoubleSpinBox spinBox;
connect(&spinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
    &data, &DataModel::handle);

考虑到所有"connect“方法所做的都是设置事件转发,这种类型要求似乎是不必要的。为什么我们不能在那里使用任何有效的函数指针呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-16 13:14:37

Qt 5之后可用的新连接选项之一是使用lambda作为插槽,在这些情况下非常有用:

代码语言:javascript
复制
// adapt the capture to your specific situation
connect(&spinBox, qOverload<double>(&QDoubleSpinBox::valueChanged),
       [&data](double arg) { data.handle(arg); });

PS:我使用了一个较短的形式来选择正确的重载,这样您可能会发现有用的:qOverload(...)

票数 1
EN

Stack Overflow用户

发布于 2019-09-15 05:24:56

还有另一个连接模板重载,它接受任何类型的函数对象。因此,我能够将我的connect方法调用重写为:

代码语言:javascript
复制
connect(&spinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
    std::bind(std::mem_fn(&DataModel::handle), &data, std::placeholders::_1);

然后,Qt不会尝试将任何内容转换为不兼容的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57941267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档