Qml 是否可以从C++;要快速查看表格?

Qml 是否可以从C++;要快速查看表格?,qml,qt5,qtquick2,Qml,Qt5,Qtquick2,我有一个带有QSqlDatabase和指向QSqlTableModel的指针的类。我使用指向QSqlTableModel的指针,因为数据库的初始化正在构造函数中进行,之后我使用该数据库创建QSqlTableModel(也在构造函数中,但已经在堆中)。 这个类是在qml中注册的类型,所以我在qml中创建它。如何更好地将TableView指向此类的QSqlTableModel指针?如果可能的话。你问什么还不完全清楚。我假设您希望与QML共享一个指向您的模型的指针 为其设置一个Q_属性。所有Q_属性s

我有一个带有QSqlDatabase和指向QSqlTableModel的指针的类。我使用指向QSqlTableModel的指针,因为数据库的初始化正在构造函数中进行,之后我使用该数据库创建QSqlTableModel(也在构造函数中,但已经在堆中)。

这个类是在qml中注册的类型,所以我在qml中创建它。如何更好地将TableView指向此类的QSqlTableModel指针?如果可能的话。

你问什么还不完全清楚。我假设您希望与QML共享一个指向您的模型的指针

  • 为其设置一个
    Q_属性
    。所有
    Q_属性
    s对QML自动可见

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

      qmlRegisterUncreatableType<QSqlTableModel>(
          "NameOfModuleInQML", 1, 0, "QSqlTableModel",
          "Cannot instanciate QSqlTableModel from QML");
      
      如果您需要:

      property QtObject mytabmodel
      
  • 从向QML注册的类的方法返回它(注意,必须返回
    QObject*
    )。这很可能是你想要的。例如

     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
    }
    
  • 您可以创建一个单例

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

  • 如果我使用您编写的第一个案例(但没有在QML中创建属性QtObject),我会得到运行时错误:“QMetaProperty::read:无法为属性“MyClass::tableModel”处理未注册的数据类型“QSqlTableModel”。如果我像你写的那样在创建属性时使用它,我会得到“无法将[undefined]分配给QObject*”错误。第二个可调用Q_的方法可以正常工作,但我无法在TableView中看到数据(我将尝试更深入地研究它)。该模型在类中声明为“QSqlTableModel*m_tableModel”。我不确定,将指向模型的指针返回到QML而不是对象是否正确?当使用选项1)并返回QSql。。。您需要注册上面指出的类型。数据不可见可能是角色名称的问题,请检查
    qDebug()roleNames()的输出(包括
    )是。我想,在第一次将模型传递给QML视图之前,您可能需要设置模型。好吧,看来QSqlTableModel没有导出角色名称(很遗憾)。看见
    QObject *tableModelProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
    {
        (void)engine;
        (void)scriptEngine;
    
        return new QSqlTableModel(...);
    }
    
    qmlRegisterSingletonType<QSqlTableModel>("NameOfModule", 1, 0, "NameInQML", tableModelProvider);
    
     QQmlEngine engine;
    
     // ..
     engine.rootContext()->setContextProperty("nameInQml", yourTableModelInstance);