如何在 QML 文件中查找属性名称为字符串的 QML 上下文属性

How to find a QML Context property with the property's name as a string in a QML file

本文关键字:属性 QML 上下文 字符串 查找 文件      更新时间:2023-10-16

我有一个模型,该模型被注册为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()
    }
}