是否可以将指针从C ++传输到Qt Quick TableView?

时间:2014-10-12 07:30:57

标签: qml qt5 qtquick2

我有一个QSqlDatabase类,并且在一个类中有指向QSqlTableModel的指针。我使用指向QSqlTableModel的指针,因为数据库的初始化正在构造函数中进行,然后我使用这个数据库创建QSqlTableModel(也在构造函数中,但已经在堆中)。
这个类是在qml中注册的类型,因此我在QML中创建它。如何更好地将TableView指向此类的QSqlTableModel指针?如果可能的话。

1 个答案:

答案 0 :(得分:3)

您所询问的内容并不完全清楚。我假设你想用QML分享一个指向模型的指针。

  1. 拥有Q_PROPERTY。 QML会自动显示所有Q_PROPERTY

    • 返回QSqlTableModel*时,您也需要注册该类型。 E.g。

      qmlRegisterUncreatableType<QSqlTableModel>(
          "NameOfModuleInQML", 1, 0, "QSqlTableModel",
          "Cannot instanciate QSqlTableModel from QML");
      
    • 请注意,您无法执行此操作:

      property QSqlTableModel mytabmodel
      

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

      property QtObject mytabmodel
      
  2. 从使用QML注册的类的方法返回它(请注意,您必须返回QObject*)。这很可能是你想要的。 E.g。

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

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

    TableView {
        model: instanceOfYourclass.model()
        // other bindings
    
        TableViewColumn {
            title: qsTr("Name")
            role: "Name"
            width: 150
        }
    
        // and so on
    }
    
  3. 您可以创建单身

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

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

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

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