如何使用预定义状态

时间:2016-11-29 20:56:23

标签: c++ qt qml qtquick2 qquickitem

我对Qt很新,所以我可能会问一个非常明显的问题。

我想为我想用C ++创建的所有自定义QML GUI元素创建一个超类型。 该超类型应该向QML项添加预定义状态。类似的东西:

    import StatedGuiElement 1.0
    import QtQuick 2.0

    Item {
        width: 300; height: 200

        StatedGuiElement {
            id: aStatedGuiElement
            anchors.centerIn: parent
            width: 100; height: 100
            //some visible Custom Gui Elements
    states:[
        State {
            name: "A_STATE"

        },
        State {
            name: "ANOTHER_STATE"
        }]
}

我知道如何从本教程(http://doc.qt.io/qt-5/qtqml-tutorials-extending-qml-example.html)创建一个简单的自定义项目。我想可以通过使用继承自QQuickItem的C ++类中的枚举来定义状态。但是,本教程未介绍如何创建更复杂的Qt Quick元素,如状态列表。

class StatedGuiElement : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName)
    //pass States via Q_PROPERTY?
public:
    //define Enum for fixed States here?
    //ENUM STATES {A_STATE, ANOTHER_STATE}
    StatedGuiElement( QQuickItem *parent = 0);

    QString name() const;
    void setName(const QString &name);


private:
    QString m_name;
    //Some List of States?


signals:

public slots:
};

所以我想知道的问题如下:

  • 甚至可以预定义QML状态类型并在多个元素中使用它们吗?
  • 如何在诸如StatedGuiElement的C ++类中添加状态列表等复杂的QML类型?

3 个答案:

答案 0 :(得分:1)

首先,您将StatedGuiElement创建为QQuickItem子类。

然后你创建一个StatedGuiElement.qml,导入包含C ++元素的包,在里面创建一个StatedGuiElement {},在QML中添加你的状态,然后你可以在你的StatedGuiElement中使用{{1}}项目。它将是预定义QML额外内容的那个。

这假设元素实际上有你需要在C ++中实现的东西。如果没有,那么根本就没有C ++元素是没有意义的。我不确定旧的C ++状态类是否可以与QML一起工作,可能不是,并且使用C ++中的QML状态将是不方便的,所以你真的应该在QML中执行状态,除了你可能拥有的任何C ++内容。

答案 1 :(得分:0)

如果将QML元素嵌套在您定义了所有状态的超类型QML元素中,则可以定义属性一次并将它们用于多个元素。子元素可以访问父参数。

或者,您也可以只为每个QML设置上下文属性,这些QML应该在C ++中使用这样的数据:

QQuickView view;

QStringList data;

// fill the list with data via append()

view.rootContext()->setContextProperty("dataList", QVariant::fromValue(data));

// now the QML can freely use and access the list with the variable name "dataList"

view.setSource(QUrl::fromLocalFile("MyItem.qml"));
view.show();

在QML方面,您还可以声明一个包含状态名称的自定义属性。

Item {
    property variant state_list: ["element1", "element2", "element3"]
    // or if you defined a list in the C++ part as a context property
    // you can use this instead:
    // property variant state_list: dataList

    states: [
        State {
            name: state_list[0]
        },

        State {
            name: state_list[1]
        },

        // and so on
    ]
}

答案 2 :(得分:0)

如果你需要一个属性列表的属性,我...... statesState个对象的列表,然后您可以使用QQmlListProperty类型在C ++中执行此操作。

列表元素类型需要QObject派生类型。

实施例

class Entry : public QObject
{
    // the list entry element's API
};

class MyItem : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(QQmlListProperty<Entry> entries READ entries)


public:
    QQmlListProperty<Entry> entries() const {
        return QQmlListProperty<Entry>(this, m_entries);
    }

private:
    QList<Entry*> m_entries;
};

同时注册qmlRegisterType()

在QML中

MyItem {
    entries: [
        Entry {
        },  
        Entry {
        }
    ]
}