是否可以将指向模型的指针从 C++ 传输到 Qt Quick TableView? [英] Is it possible to transmit pointer to model from C++ to Qt Quick TableView?

查看:54
本文介绍了是否可以将指向模型的指针从 C++ 传输到 Qt Quick TableView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个类中有 QSqlDatabase 类和指向 QSqlTableModel 的指针.我使用指向 QSqlTableModel 的指针,因为数据库的初始化在构造函数中进行,之后我使用这个数据库(也在构造函数中但已经在堆中)创建了 QSqlTableModel.
这个类是在 qml 中注册的类型,所以我在 QML 中创建它.怎么把TableView指向这个类的QSqlTableModel指针比较好?如果可能的话.

I have class with QSqlDatabase and with pointer to QSqlTableModel in one class. I use pointer to QSqlTableModel, because initialization of database is going on in constructor and after that I create QSqlTableModel using this database (also in constructor but in heap already).
This class is registered type in qml and so I create it in QML. How is it better to point out TableView to the QSqlTableModel pointer of this class? If it is possible.

推荐答案

您在问什么并不完全清楚.我将假设您想与 QML 共享一个指向您的模型的指针.

It is not entirely clear what you're asking. I'm going to assume you want to share a pointer to your model with QML.

  1. 为它准备一个 Q_PROPERTY.所有 Q_PROPERTY 都自动对 QML 可见.

  1. Have a Q_PROPERTY for it. All Q_PROPERTYs are automatically visible to QML.

  • 当返回 QSqlTableModel* 时,您也需要注册该类型.例如

  • When returning QSqlTableModel* you need to register that type, too. E.g.

qmlRegisterUncreatableType<QSqlTableModel>(
    "NameOfModuleInQML", 1, 0, "QSqlTableModel",
    "Cannot instanciate QSqlTableModel from QML");

  • 请注意,您不能这样做:

  • Note that you cannot do this then:

    property QSqlTableModel mytabmodel
    

    如果需要,请改为执行此操作:

    do this instead if you need to:

    property QtObject mytabmodel
    

  • 从注册到 QML 的类的方法中返回它(注意必须返回 QObject*).这很可能是您想要的.例如

    Return it from a method of a class registered with QML (note that you must return QObject*). This is very likely what you want. E.g.

     class SomeClass : public QObject {
          // ...
     public:
         Q_INVOKABLE QObject *model() {
              return tableModel;
         }
         // ...
     };
    

    然后您可以在 QML 中执行此操作:

    Then you can do this in QML:

    TableView {
        model: instanceOfYourclass.model()
        // other bindings
    
        TableViewColumn {
            title: qsTr("Name")
            role: "Name"
            width: 150
        }
    
        // and so on
    }
    

  • 你可以创建一个单例

  • You can create a singleton

    QObject *tableModelProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
    {
        (void)engine;
        (void)scriptEngine;
    
        return new QSqlTableModel(...);
    }
    
    qmlRegisterSingletonType<QSqlTableModel>("NameOfModule", 1, 0, "NameInQML", tableModelProvider);
    

    如果您的模型只有一个实例并且您不需要太多初始化它,那么这是一种合适的方法.

    This is a suitable approach if there is and ever will be only one instance of your model and if you don't need much to initialize it.

    将您的模型设置为上下文属性

    Set your model as a context property

     QQmlEngine engine;
    
     // ..
     engine.rootContext()->setContextProperty("nameInQml", yourTableModelInstance);
    

  • 这篇关于是否可以将指向模型的指针从 C++ 传输到 Qt Quick TableView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆