我对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:
};
所以我想知道的问题如下:
StatedGuiElement
的C ++类中添加状态列表等复杂的QML类型?答案 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)
如果你需要一个属性列表的属性,我...... states
是State
个对象的列表,然后您可以使用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 {
}
]
}