我有一个数据模型对象,它有一个处理Qt事件的方法。但是,当我试图将事件处理程序连接到此方法时,会出现编译时错误。问题是connect模板最终会对第四个参数执行一个static_cast<void (QObject::*)(double)>。由于我的数据模型不是从QObject继承的,所以这段代码会生成错误C2664:
指向的类型是不相关的;转换需要reinterpret_cast、C样式的强制转换或函数类型的转换。
是否有方法将事件处理程序连接到非QObject类型?一个最小的例子是:
struct DataModel {
void handle(double) { }
};
DataModel data;
QDoubleSpinBox spinBox;
connect(&spinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
&data, &DataModel::handle);考虑到所有"connect“方法所做的都是设置事件转发,这种类型要求似乎是不必要的。为什么我们不能在那里使用任何有效的函数指针呢?
发布于 2019-09-16 13:14:37
Qt 5之后可用的新连接选项之一是使用lambda作为插槽,在这些情况下非常有用:
// adapt the capture to your specific situation
connect(&spinBox, qOverload<double>(&QDoubleSpinBox::valueChanged),
[&data](double arg) { data.handle(arg); });PS:我使用了一个较短的形式来选择正确的重载,这样您可能会发现有用的:qOverload(...)。
发布于 2019-09-15 05:24:56
还有另一个连接模板重载,它接受任何类型的函数对象。因此,我能够将我的connect方法调用重写为:
connect(&spinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
std::bind(std::mem_fn(&DataModel::handle), &data, std::placeholders::_1);然后,Qt不会尝试将任何内容转换为不兼容的类型。
https://stackoverflow.com/questions/57941267
复制相似问题