我想在基类中拥有QObject::connect
的代理。目标是将QMetaObject::Connection
返回的所有connect
存储在一个向量中。
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);
}
有人可以解释一下为什么它不起作用?以及如何使其发挥作用?
答案 0 :(得分:0)
这是有效的代码,适用于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);
}
}