2017-07-31 8 views
1

私のプロジェクトの1つでは、パラメータとしてstd::vector<bool>を使用してQt信号とスロット機構を使用しようとしています。私のプロジェクトは以下の最小限のコードと同等です:信号とスロットのstd :: vector:lvalueの問題

クラスのApp

// 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(); 
} 

クラスエミッタ

//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"; 
    }); 
} 

何らかの理由でコンパイラがまったく気に入らず、このスタックを印刷します。 Error stack

何をすればいいですか?ありがとう

+0

ベクトル*を(おそらく定数)参照ではなく、値*で渡す理由はありますか? –

+0

これは参考になりましたが、値で行うことが可能かどうか疑問に思っていました – Xatyrian

答えて

1

シグナル/スロット値はQtメタシステムに登録する必要がありますが、デフォルトではstd::vectorは登録されていないと思います。代わりにQVectorを使用していない理由はありますか?

詳細については、Q_DECLARE_METATYPEqRegisterMetaType()を参照してください。

+0

標準のコンテナを使用するには[多くの良い理由があります](https://marcmutz.wordpress.com/effective-qt/containers/)がありますQtのものより。 –

+0

まあ、最初は、私は完全にQVector:pを忘れてしまった! 'Q_DECLARE_METATYPE'と' qRegisterMetaType() 'について:私はこれらを使ってみましたが、プログラムがコンパイルされないので、問題を解決していません。 – Xatyrian

関連する問題