【问题标题】:Qt own enum in classQt在课堂上自己的枚举
【发布时间】:2013-08-28 00:22:02
【问题描述】:

我想在 Qt 的一个类中声明我自己的枚举并将其用于信号和插槽,但我得到了这个错误。

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 放在哪里以及使用哪个参数。

【问题讨论】:

    标签: c++ qt enums signals-slots


    【解决方案1】:

    你必须这样做:

    Q_DECLARE_METATYPE(ClassA::MyEnum)

    在您的 classA.h 标头中。

    然后在 ClassA 构造函数中(或 main() 但记得先在其中包含 classa.h):

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

    然后使用like:

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

    【讨论】:

      【解决方案2】:

      Qt抛出的错误描述性很强:

      确保使用 qRegisterMetaType() 注册 'ClassA::MyEnum'

      所以你需要包含这一行:

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

      在您知道它将被调用的代码的任何部分。我过去常常在我的应用程序的主要功能中包含 qRegisterMetaType。我建议您查看有关以下主题的 Qt 文档:qRegisterMetaType & Q_DECLARE_METATYPE。

      【讨论】:

        【解决方案3】:

        您可以避免调用Q_DECLARE_METATYPEqRegisterMetaType(),使用Qt 5.5 中添加的Q_ENUM

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-27
          • 2023-03-25
          • 1970-01-01
          • 2016-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多