【问题标题】:QObject::connect and template causes issueQObject::connect 和模板导致问题
【发布时间】: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 不支持可变参数模板。

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


【解决方案1】:

这是有效代码,可与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);
    }
}

【讨论】:

  • 感谢您确认它有效 :) 实际上,在我的代码中,我添加了一个在某处调用的 clearConnections(),因此显然连接已被删除哈哈。我就是傻^^
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多