QObject::connect 和模板导致问题

Posted

技术标签:

【中文标题】QObject::connect 和模板导致问题【英文标题】:QObject::connect and template causes issue 【发布时间】: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 不支持可变参数模板。 【参考方案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(),因此显然连接已被删除哈哈。我就是傻^^

以上是关于QObject::connect 和模板导致问题的主要内容,如果未能解决你的问题,请参考以下文章

包装 QObject::connect 错误

QObject::connect: 没有这样的信号

如何在我的代码中查明触发 QObject::connect 的调用的位置:无法在 Qt5 中对类型的参数进行排队?

QObject::connect 在 QRunnable - 控制台

QObject::connect: 没有这样的信号(类名)(信号名)(属性)

QObject::connect timer with update() 函数