QObject :: connect和template导致问题

时间:2015-07-25 20:14:23

标签: c++ qt c++11 qobject

我想在基类中拥有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);
}

有人可以解释一下为什么它不起作用?以及如何使其发挥作用?

1 个答案:

答案 0 :(得分:0)

这是有效的代码,适用于variadic templatesstd::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);
    }
}