C++ QObject::连接和模板导致问题
我想在基类中为C++ QObject::连接和模板导致问题,c++,qt,c++11,qobject,C++,Qt,C++11,Qobject,我想在基类中为QObject::connect创建一个代理。目标是将connect返回的所有QMetaObject::Connection存储在一个向量中 class MyBaseClass : public QObject { Q_OBJECT; template <typename... Args> void addConnection(Args... args) { auto c = this->connect(args...);
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);
}
}
但这不起作用:
addConnection(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v) {
qDebug() << QString::number(value);
}
addConnection(this,&classthattheritsbaseclass::valueChanged,[this](int v){
qDebug()它是有效的代码,可用于可变模板
和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
它是有效的代码,可用于可变模板
和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
上次我检查时,Qt不支持可变模板。上次我检查时,Qt不支持可变模板。感谢您确认它可以工作:)实际上,在我的代码中,我添加了一个clearConnections()那是在某个地方调用的,所以很明显连接被删除了哈哈。我很愚蠢^^谢谢你确认它能工作:)事实上,在我的代码中,我添加了一个clearConnections(),它在某个地方被调用,所以很明显连接被删除了哈哈。我很愚蠢^^
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");
template <typename... Args>
void addConnection(Args... args) {
auto c = this->connect(std::forward<Args>(args)...);
if (c) {
connections.push_back(c);
}
}