gpt4 book ai didi

c++ - 如何在 QML 文件中使用属性名称作为字符串查找 QML 上下文属性

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:26 25 4
gpt4 key购买 nike

我有一个注册为 QML 上下文属性的模型:

modelPtr = new MyModel();
engine_.rootContext()->setContextProperty(modelName, modelPtr);

在我的 QML 文件中,而不是像这样将 modelName 硬编码为属性绑定(bind):

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()
}
}

关于c++ - 如何在 QML 文件中使用属性名称作为字符串查找 QML 上下文属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30055116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com