QObject::connect 和模板导致问题
QObject::connect and template causes issue
我想在基础 class 中为 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
的 class 发出信号时,它什么也不做。例如,这确实有效:
connect(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v) {
qDebug() << QString::number(value);
}
但这不起作用:
addConnection(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v) {
qDebug() << QString::number(value);
}
有人能解释一下为什么它不起作用吗?以及如何让它发挥作用?
它是有效代码,适用于 variadic templates
和 std::tuple
。下面的代码是完整的示例:
Header:
#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);
}
}
我想在基础 class 中为 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
的 class 发出信号时,它什么也不做。例如,这确实有效:
connect(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v) {
qDebug() << QString::number(value);
}
但这不起作用:
addConnection(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v) {
qDebug() << QString::number(value);
}
有人能解释一下为什么它不起作用吗?以及如何让它发挥作用?
它是有效代码,适用于 variadic templates
和 std::tuple
。下面的代码是完整的示例:
Header:
#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);
}
}