Я довольно новичок в 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:
};
Итак, вопросы, которые меня интересуют, таковы:
StatedGuiElement
?Сначала вы создаете свой StatedGuiElement
как QQuickItem
подкласс.
Затем вы создаете StatedGuiElement.qml
импортировать пакет, содержащий элемент C ++, сделать StatedGuiElement {}
внутри, добавьте свои состояния в QML, тогда вы можете использовать StatedGuiElement
в вашем проекте. Это будет тот, с предопределенным дополнительным материалом QML.
Это предполагает, что у элемента действительно есть вещи, которые вам нужно реализовать в C ++. Если нет, то вообще не имеет смысла иметь элемент C ++. Я не уверен, будут ли старые классы состояний C ++ работать с QML, возможно, нет, и использование состояний QML из C ++ будет совсем не удобно, поэтому вы действительно должны делать состояния в QML поверх любых вещей C ++, которые у вас могут быть.
Можно определить ваши свойства один раз и использовать их в нескольких элементах, если вы вложите свои элементы 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
]
}
Если вам нужно свойство, представляющее собой список элементов, т.е. 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 {
}
]
}