【问题标题】:QML signal with a C++ enum type具有 C++ 枚举类型的 QML 信号
【发布时间】:2017-09-06 09:01:17
【问题描述】:

我有一个要向 QML 公开的课程,如下所示:

#ifndef MYTYPE_H
#define MYTYPE_H

#include <QString>
#include <QObject>


class MyType : public QObject
{
    Q_OBJECT
    Q_ENUMS(TestEnum)
    Q_PROPERTY(TestEnum foo READ foo WRITE setFoo NOTIFY fooChanged)

public:

    enum class TestEnum
    {
        State1 = 1,
        State2 = 2
    };

    MyType(QObject *parent = nullptr) :
        QObject(parent),
        mFoo(TestEnum::State1)
    {
    }

    TestEnum foo() const
    {
        return mFoo;
    }

    void setFoo(TestEnum foo)
    {
        if (foo == mFoo)
            return;

        mFoo = foo;
        emit fooChanged(mFoo);
    }

signals:
    void fooChanged(MyType::TestEnum blah);

private:
    TestEnum mFoo;
};

Q_DECLARE_METATYPE(MyType::TestEnum)

#endif // MYTYPE_H

这里我有一个枚举类型,我想向 QML 公开它。

我将主函数调用的类型注册为:

qmlRegisterType<MyType>("App", 1, 0, "MyType");

现在我的 qml 文件中有一个信号,我采用了这个枚举参数:

signal submitTextField(MyType::TestEnum state) // Compiler complains here

信号连接为:

QObject *topLevel = engine.rootObjects().value(0);
//QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
// This is just a class that implements the slot
HandleTextField handleTextField;
// connect our QML signal to our C++ slot
QObject::connect(topLevel, SIGNAL(submitTextField(MyType::TestEnum)),
                     &handleTextField, SLOT(handleSubmitTextField(MyType::TestEnum)));

实现slot的类定义为:

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

public slots:
    void handleSubmitTextField(MyType::TestEnum in);
    void handleFooChanged(MyType::TestEnum in);
public:
    MyType myType;

};

语法MyType::TestEnum 无效。我很想将所有内容都转换为 ints 并取消枚举,但想知道是否有办法在 QML 信号中使用这种枚举类型。 MyType.State1 and MyType.State2 可以,但无法引用枚举类型。

【问题讨论】:

  • 无法引用枚举类型是什么意思?你想做什么?
  • @perencia 编辑了一些代码。只是想在 C++ 和 Qt 之间做一个信号槽连接,其中 QML 中定义的信号采用枚举类型作为参数

标签: qt enums qml signals-slots


【解决方案1】:

好吧,这似乎不能用枚举来完成,即你必须使用ints。我进行了以下更改并且它有效:

class MyType : public QObject
{
    Q_OBJECT
    Q_ENUMS(TestEnum)
    Q_PROPERTY(TestEnum foo READ foo WRITE setFoo NOTIFY fooChanged)

public:

    enum TestEnum
    {
        State1 = 1,
        State2 = 2
    };

    MyType(QObject *parent = nullptr) :
        QObject(parent),
        mFoo(TestEnum::State1)
    {
    }

    TestEnum & foo()
    {
        return mFoo;
    }

    void setFoo(TestEnum foo)
    {
        if (foo == mFoo)
            return;

        mFoo = foo;
        emit fooChanged(static_cast<int>(mFoo));
    }

signals:
    void fooChanged(int blah);

private:
    TestEnum mFoo;
};

Q_DECLARE_METATYPE(MyType::TestEnum)

插槽也需要更改:

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

public slots:
    void handleSubmitTextField(int in);
    void handleFooChanged(int in);
public:
    MyType myType;

};

我们需要更改int类型的连接:

QObject::connect(topLevel, SIGNAL(submitTextField(int)),
                         &handleTextField, SLOT(handleSubmitTextField(int)));

最后将信号声明为:

signal submitTextField(int text)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多