C++ 带有std::vector的信号和插槽:左值问题

C++ 带有std::vector的信号和插槽:左值问题,c++,qt,c++11,C++,Qt,C++11,在我的一个项目中,我尝试使用Qt信号和插槽机制,并使用std::vector作为参数。我的项目相当于以下最小代码: 课堂应用程序 // app.h #ifndef APP_H #define APP_H #include <QObject> #include <QSharedPointer> #include "emitter.h" #include "receiver.h" class App : public QObject { Q_OBJECT pub

在我的一个项目中,我尝试使用Qt信号和插槽机制,并使用
std::vector
作为参数。我的项目相当于以下最小代码:

课堂应用程序

// app.h
#ifndef APP_H
#define APP_H

#include <QObject>
#include <QSharedPointer>

#include "emitter.h"
#include "receiver.h"

class App : public QObject
{
    Q_OBJECT
public:
    App(QObject *parent = 0);

};

#endif // APP_H

// app.cpp

#include "app.h"

App::App(QObject* parent): QObject(parent)
{
    Emitter emitter;
    Receiver receiver;

    receiver.attachEmitter(emitter);
    emitter.run();
}
//app.h
#ifndef应用程序
#定义应用程序
#包括
#包括
#包括“emitter.h”
#包括“receiver.h”
类应用程序:公共QObject
{
Q_对象
公众:
应用程序(QObject*parent=0);
};
#endif//APP_H
//app.cpp
#包括“app.h”
应用程序::应用程序(QObject*父对象):QObject(父对象)
{
发射极-发射极;
接收机;
接收器、附件(发射器);
emitter.run();
}
类发射器

//emitter.h
#ifndef EMITTER_H
#define EMITTER_H

#include <QObject>
#include <vector>
#include "helper.h"

class Helper;

class Emitter : public QObject
{
    Q_OBJECT
public:
    explicit Emitter(QObject *parent = 0);
    void run();
signals:
    void triggered(std::vector<bool> value);
};

#endif // EMITTER_H

// emitter.cpp
#include "emitter.h"

Emitter::Emitter(QObject *parent) : QObject(parent)
{

}

void Emitter::run()
{
    emit triggered(Helper::value());
}
//receiver.h
#ifndef RECEIVER_H
#define RECEIVER_H

#include <QObject>
#include <QDebug>

#include <QSharedPointer>
#include "emitter.h"

class Emitter;

class Receiver : public QObject
{
    Q_OBJECT
public:
    explicit Receiver(QObject *parent = 0);
    void attachEmitter(QSharedPointer<Emitter> emitter);
signals:

public slots:
};

//receiver.cpp
#include "receiver.h"

Receiver::Receiver(QObject *parent) : QObject(parent)
{

}

void Receiver::attachEmitter(QSharedPointer<Emitter> emitter)
{
    connect(emitter.data(), &Emitter::triggered, [this](std::vector<bool> value) {
        qDebug() << "Received value";
    });
}
//emitter.h
#ifndef发射器
#定义发射器
#包括
#包括
#包括“helper.h”
班级助理;
类发射器:公共QObject
{
Q_对象
公众:
显式发射器(QObject*parent=0);
无效运行();
信号:
无效触发(标准::矢量值);
};
#endif//EMITTER\u H
//发射器.cpp
#包括“emitter.h”
发射器::发射器(QObject*父对象):QObject(父对象)
{
}
void发射器::run()
{
发射触发(Helper::value());
}
职业接受者

//emitter.h
#ifndef EMITTER_H
#define EMITTER_H

#include <QObject>
#include <vector>
#include "helper.h"

class Helper;

class Emitter : public QObject
{
    Q_OBJECT
public:
    explicit Emitter(QObject *parent = 0);
    void run();
signals:
    void triggered(std::vector<bool> value);
};

#endif // EMITTER_H

// emitter.cpp
#include "emitter.h"

Emitter::Emitter(QObject *parent) : QObject(parent)
{

}

void Emitter::run()
{
    emit triggered(Helper::value());
}
//receiver.h
#ifndef RECEIVER_H
#define RECEIVER_H

#include <QObject>
#include <QDebug>

#include <QSharedPointer>
#include "emitter.h"

class Emitter;

class Receiver : public QObject
{
    Q_OBJECT
public:
    explicit Receiver(QObject *parent = 0);
    void attachEmitter(QSharedPointer<Emitter> emitter);
signals:

public slots:
};

//receiver.cpp
#include "receiver.h"

Receiver::Receiver(QObject *parent) : QObject(parent)
{

}

void Receiver::attachEmitter(QSharedPointer<Emitter> emitter)
{
    connect(emitter.data(), &Emitter::triggered, [this](std::vector<bool> value) {
        qDebug() << "Received value";
    });
}
//receiver.h
#ifndef接收机
#定义接收器
#包括
#包括
#包括
#包括“emitter.h”
类发射器;
类接收者:公共QObject
{
Q_对象
公众:
显式接收器(QObject*parent=0);
空隙附着器(QSharedPointer-emitter);
信号:
公众时段:
};
//receiver.cpp
#包括“receiver.h”
接收者::接收者(QObject*父对象):QObject(父对象)
{
}
无效接收器::附加器(QSharedPointer发射器)
{
连接(emitter.data(),&emitter::triggered,[this](std::vector value){

qDebug()信号/插槽值按值传递必须在Qt元系统中注册,我认为默认情况下不会注册
std::vector
。您不使用
QVector
有什么原因吗


有关更多信息,请查看和。

是否存在按值而不是按(可能是常数)传递向量的原因引用?它是通过引用工作的,但我想知道是否可以通过值来实现。与Qt容器相比,人们更喜欢标准容器。好吧,一开始,我完全忘记了QVector:p!关于
Q\u DECLARE\u METATYPE
qRegisterMetaType()
:我尝试使用这些,但由于程序无法编译,因此无法解决问题。