如何在 QML 文件中查找属性名称为字符串的 QML 上下文属性
How to find a QML Context property with the property's name as a string in a QML file
我有一个模型,该模型被注册为QML上下文属性:
modelPtr = new MyModel();
engine_.rootContext()->setContextProperty(modelName, modelPtr);
在我的QML文件中,而不是将模型名称作为属性绑定的属性名称:
ListView {
model: modelName
}
有没有一种方法可以通过字符串名称搜索想要的模型?
到目前为止,我已经尝试过:
Item {
property string modelName
ListView {
id: myListView
Component.onCompleted: {
myListView.model = Qt.binding(function() { return modelManager.getModel(modelName) } )
}
}
}
ModelManager包含系统使用的所有模型(并且是注册上下文属性),而函数" GetModel"将QoBject*返回到所需的模型。此方法似乎不适用于模型更新。
它应该起作用,但是如果不看到您的模型,就很难说出了什么问题。这对我有用:
#include <QAbstractItemModel>
#include <QStandardItemModel>
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
class ModelManager : public QObject
{
Q_OBJECT
public:
ModelManager() {
QStandardItemModel *model1 = new QStandardItemModel(4, 1, this);
for (int row = 0; row < 4; ++row) {
QStandardItem *item = new QStandardItem(QString("model1 row %0, column 0").arg(row));
model1->setItem(row, 0, item);
}
mModels.insert("model1", model1);
QStandardItemModel *model2 = new QStandardItemModel(4, 1, this);
for (int row = 0; row < 4; ++row) {
QStandardItem *item = new QStandardItem(QString("model2 row %0, column 0").arg(row));
model2->setItem(row, 0, item);
}
mModels.insert("model2", model2);
}
Q_INVOKABLE QObject *getModel(const QString &modelName) {
return mModels.value(modelName);
}
Q_INVOKABLE void changeStuff() {
QStandardItemModel *model = static_cast<QStandardItemModel*>(mModels.value("model1"));
QStandardItem *item = model->item(0, 0);
item->setText("model1 row 0 column 0 - changed");
}
private:
QHash<QString, QAbstractItemModel*> mModels;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ModelManager modelManager;
qRegisterMetaType<QAbstractItemModel*>();
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("modelManager", &modelManager);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
#include "main.moc"
qml:
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
visible: true
ComboBox {
id: comboBox
model: ["model1", "model2"]
}
ListView {
id: listView
width: 200
height: 200
anchors.centerIn: parent
model: modelManager.getModel(comboBox.currentText)
delegate: Rectangle {
width: listView.width
height: text.implicitHeight
Text {
id: text
anchors.centerIn: parent
text: display
}
}
}
Button {
text: "Change stuff"
anchors.horizontalCenter: listView.horizontalCenter
onClicked: modelManager.changeStuff()
}
}
相关文章:
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- Qt Quick-如何仅从c++代码与qml属性交互
- 如何将类的属性从 c++ 获取到 QML 中
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 属性分配无效:"displayText"是文本字段 qml 中的只读属性
- QVariants 在 QML 中的C++和属性中的使用
- 在 QML 中更改父属性时更改子属性
- QML / C++可选属性
- QML 检测到属性宽度的绑定循环(TextMetrics 行为很奇怪)
- 可以从C++在QML上编写上下文属性吗?
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 如何从 c++ 更改 QML 项的属性
- 使用 QAbstractListModel 分配 QML 布尔属性失败
- QML 无法分配给不存在的属性
- 从C++使用编译时安全性更改 QML 属性
- Javascript 函数作为从 c++ 定义的 QML 属性
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- 从C 读取QML数组属性
- 如何使用 API 获取 QML 对象的 id 属性C++
- Qt-Qml连接到上下文属性的QObject属性的信号