QObject::connect 和模板导致问题
Posted
技术标签:
【中文标题】QObject::connect 和模板导致问题【英文标题】:QObject::connect and template causes issue 【发布时间】:2015-07-25 20:14:22 【问题描述】:我想在基类中有一个QObject::connect
的代理。目标是将connect
返回的所有QMetaObject::Connection
存储在一个向量中。
class MyBaseClass : public QObject
Q_OBJECT;
template <typename... Args>
void addConnection(Args... args)
auto c = this->connect(args...);
if (c)
connections.push_back(c);
问题是连接不再起作用。当我从继承MyBaseClass
的类发出信号时,它什么也不做。例如,这确实有效:
connect(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v)
qDebug() << QString::number(value);
但这不起作用:
addConnection(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v)
qDebug() << QString::number(value);
有人能解释一下为什么它不起作用吗?以及如何让它发挥作用?
【问题讨论】:
上次检查时,Qt 不支持可变参数模板。 【参考方案1】:这是有效代码,可与variadic templates
和std::tuple
一起使用。下面的代码是完整的工作示例:
标题:
#ifndef MYBASECLASS_H
#define MYBASECLASS_H
#include <QObject>
class MyBaseClass : public QObject
Q_OBJECT
std::vector<QMetaObject::Connection> connections;
public:
template <typename T>
void addConnectionTuple(const T& t) //not best
auto c = this->connect(std::get<0>(t),std::get<1>(t),std::get<2>(t));
if (c)
connections.push_back(c);
template <typename... Args>
void addConnection(Args... args)
auto c = this->connect(args...);
if (c)
connections.push_back(c);
;
#endif // MYBASECLASS_H
代码:
QObject aa;
MyBaseClass bb;
std::make_tuple(10,5);
bb.addConnectionTuple(std::make_tuple(&aa, &QObject::objectNameChanged, [](QString v)
qDebug() << v;
));
aa.setObjectName("super");
或者
QObject aa;
MyBaseClass bb;
std::make_tuple(10,5);
bb.addConnection(&aa, &QObject::objectNameChanged, [](QString v)
qDebug() << v;
);
aa.setObjectName("super");
std::forward
也可以使用。
template <typename... Args>
void addConnection(Args... args)
auto c = this->connect(std::forward<Args>(args)...);
if (c)
connections.push_back(c);
【讨论】:
感谢您确认它有效 :) 实际上,在我的代码中,我添加了一个在某处调用的 clearConnections(),因此显然连接已被删除哈哈。我就是傻^^以上是关于QObject::connect 和模板导致问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的代码中查明触发 QObject::connect 的调用的位置:无法在 Qt5 中对类型的参数进行排队?
QObject::connect 在 QRunnable - 控制台