3

Qt のクラスで独自の enum を宣言し、それをシグナルとスロットに使用したいのですが、このエラーが発生します。

QObject::connect: Cannot queue arguments of type 'ClassA::MyEnum'
(Make sure 'ClassA::MyEnum' is registered using qRegisterMetaType().)

これは私のソースコードです:

ClassA.h

public:
    enum MyEnum {
        READING = 0,
        STOPPED = 1,
        FINISHED = 2
    };

signals:
    void changed(QString text, int readTextInPercent, ClassA::MyEnum status);

ClassA.cpp

emit changed(QString("string"), 50, ClassA::READING);

ClassB.h

public slots:
    void changed(QString text, int readTextInPercent, ClassA::MyEnum status);

ClassB.cpp

this->connect(m_ClassA, SIGNAL(changed(QString, int, ClassA::MyEnum)), this, SLOT(changed(QString, int, ClassA::MyEnum)));

void ClassB::changed(QString text, int readTextInPercent, ClassA::MyEnum status) {

}

どこにどのパラメータを入れなければならないのかわかりませんqRegisterMetaType

4

3 に答える 3

7

あなたがしなければなりません:

Q_DECLARE_METATYPE(ClassA::MyEnum)

classA.h ヘッダーに。

次に、ClassA コンストラクター (または main() ですが、最初に classa.h を含めることを忘れないでください) で:

qRegisterMetaType<ClassA::MyEnum>("ClassA::MyEnum");

次に、次のように使用します。

connect(whatever, SIGNAL(whatever_uses_myenum(ClassA::MyEnum)), ..., ...)

于 2013-08-28T00:51:14.783 に答える
3

Qt によってスローされるエラーは非常にわかりやすいものです。

qRegisterMetaType() を使用して「ClassA::MyEnum」が登録されていることを確認してください

したがって、次の行を含める必要があります。

qRegisterMetaType<ClassA::MyEnum>("ClassA::MyEnum");

呼び出されることがわかっているコードの任意の部分で。私はアプリケーションのメイン関数に qRegisterMetaType を含めていました。トピックに関する Qt ドキュメントを参照することをお勧めします: qRegisterMetaType & Q_DECLARE_METATYPE。

于 2013-08-28T00:52:45.500 に答える