Как создать пользовательский элемент Quick QML с предопределенными состояниями

Я довольно новичок в Qt, поэтому я, вероятно, задаю довольно очевидный вопрос.

Я хотел бы создать супер-тип для всех своих пользовательских элементов QML GUI, которые я хочу создать в C ++.
Предполагается, что этот супертип добавляет предопределенные состояния в элемент 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). Я думаю, что состояния могут быть определены с помощью перечисления в классе C ++, который наследует от QQuickItem, Однако этот учебник не показывает, как создавать более сложные элементы 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 и использовать их в нескольких элементах?
  • Как добавить сложные типы QML, такие как списки состояний, в класс C ++, такой как StatedGuiElement?

0

Решение

Сначала вы создаете свой StatedGuiElement как QQuickItem подкласс.

Затем вы создаете StatedGuiElement.qmlимпортировать пакет, содержащий элемент C ++, сделать StatedGuiElement {} внутри, добавьте свои состояния в QML, тогда вы можете использовать StatedGuiElement в вашем проекте. Это будет тот, с предопределенным дополнительным материалом QML.

Это предполагает, что у элемента действительно есть вещи, которые вам нужно реализовать в C ++. Если нет, то вообще не имеет смысла иметь элемент C ++. Я не уверен, будут ли старые классы состояний C ++ работать с QML, возможно, нет, и использование состояний QML из C ++ будет совсем не удобно, поэтому вы действительно должны делать состояния в QML поверх любых вещей C ++, которые у вас могут быть.

1

Другие решения

Можно определить ваши свойства один раз и использовать их в нескольких элементах, если вы вложите свои элементы QML в супер-тип элемента QML, в котором определены все ваши состояния. Дочерние элементы могут обращаться к родительским параметрам.

В качестве альтернативы, вы также можете просто установить свойство context для каждого 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
]
}
0

Если вам нужно свойство, представляющее собой список элементов, т.е. states быть списком State объекты, то вы можете сделать это в C ++, используя QQmlListProperty тип.

Тебе необходимо 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 {
}
]
}
0
По вопросам рекламы [email protected]