QT QML - 从另一个类访问 qml 模型

Posted

技术标签:

【中文标题】QT QML - 从另一个类访问 qml 模型【英文标题】:QT QML - access qml model from another class 【发布时间】:2019-07-22 20:40:37 【问题描述】:

我需要有“myclient”类来处理来自套接字的输入数据。数据到达后,它应该从 qml 模型类“mymodel”调用函数“add”。如何访问在 main.cpp 中创建的模型实例?

这是一个具有文本输入功能的示例:

类:main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "mymodel.h"
#include "myclient.h"
int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    MyModel *theModel=new MyModel;
    engine.rootContext()->setContextProperty("theModel", theModel);

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) 
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    , Qt::QueuedConnection);
    engine.load(url);

    myclient cli;    //doesn't add the data to list in it's constructor
    theModel.add("Added in main.cpp");   //works as expected

    return app.exec();

现在是 myModel.h 类

#ifndef MYMODEL_H
#define MYMODEL_H
#include <QObject>
#include <QAbstractTableModel>
#include <QModelIndex>
#include <QHash>
#include <QVariant>
#include <QByteArray>
#include <QList>
#include <QDebug>


class MyModel: public QAbstractListModel

    Q_OBJECT
public:
    MyModel(QObject* parent=nullptr): QAbstractListModel (parent)
    
        innerModel.append("Bob");
        innerModel.append("Patrick");
        innerModel.append("Alice");
    
    Q_INVOKABLE int rowCount(const QModelIndex &parent = QModelIndex()) const override
    
        if (parent.isValid())
            return 0;
        return innerModel.size();
    
    Q_INVOKABLE int columnCount(const QModelIndex &parent = QModelIndex()) const override
    
        if (parent.isValid())
            return 0;
        return 2;
    
    Q_INVOKABLE QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
    
        qDebug() << index << role;
        switch (role)
        
            case Qt::DisplayRole:
            case Qt::UserRole + 1:
                return innerModel.at(index.row());
            case Qt::UserRole + 2:
                return QString::number(index.row() + 1);
        
        return QVariant();
    

    Q_INVOKABLE QHash<int,QByteArray> roleNames() const override
    
        QHash<int,QByteArray> roles;
        roles.insert(Qt::UserRole + 1, "name");
        roles.insert(Qt::UserRole + 2, "index");
        return roles;
    

    Q_INVOKABLE void add(QString const& name)
    
        beginInsertRows(QModelIndex(), rowCount(), rowCount());
        innerModel.append(name);
        endInsertRows();
    
    private:
        QList<QString> innerModel;
;
#endif // MYMODEL_H

最后是 myclient.h

我尝试过这种方式,但我知道我在这里创建了另一个 myModel 实例

#ifndef MYCLIENT_H
#define MYCLIENT_H
#include "mymodel.h"

class myclient

public:
    myclient()
    
        MyModel mod;
        mod.add("Added from myclient");
    
;

#endif // MYCLIENT_H

如何在应用程序的其他部分访问 myModel 的方法(在 main.cpp 中加载到引擎中的实例)?还是有另一种方法可以做到这一点?谢谢

【问题讨论】:

【参考方案1】:

如果您想访问客户端类中的模型,请将其作为构造函数的参数传递为该类的成员。

myclient.h

#ifndef MYCLIENT_H
#define MYCLIENT_H
#include "mymodel.h"

class myclient

public:
    myclient(MyModel *model): m_model(model)
    
        m_model->add("Added from myclient");
    
private:
    MyModel *m_model;
;

#endif // MYCLIENT_H

ma​​in.cpp

// ...
myclient cli(&theModel);
// ...

【讨论】:

以上是关于QT QML - 从另一个类访问 qml 模型的主要内容,如果未能解决你的问题,请参考以下文章

QML , 如何从另一个 qml 访问元素

如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?

从 QML 简单访问 C++ 对象数据

在 Qt/QML 中访问/修改一个类型的所有实例

Qt/QML:在加载程序加载后访问 ListView 以跳转到特定项目/页面

如果数据库可访问,如何快速检查? (Qt、QML、C++)- Linux