Qml 是否可以从C++;要快速查看表格?
我有一个带有QSqlDatabase和指向QSqlTableModel的指针的类。我使用指向QSqlTableModel的指针,因为数据库的初始化正在构造函数中进行,之后我使用该数据库创建QSqlTableModel(也在构造函数中,但已经在堆中)。Qml 是否可以从C++;要快速查看表格?,qml,qt5,qtquick2,Qml,Qt5,Qtquick2,我有一个带有QSqlDatabase和指向QSqlTableModel的指针的类。我使用指向QSqlTableModel的指针,因为数据库的初始化正在构造函数中进行,之后我使用该数据库创建QSqlTableModel(也在构造函数中,但已经在堆中)。 这个类是在qml中注册的类型,所以我在qml中创建它。如何更好地将TableView指向此类的QSqlTableModel指针?如果可能的话。你问什么还不完全清楚。我假设您希望与QML共享一个指向您的模型的指针 为其设置一个Q_属性。所有Q_属性s
这个类是在qml中注册的类型,所以我在qml中创建它。如何更好地将TableView指向此类的QSqlTableModel指针?如果可能的话。你问什么还不完全清楚。我假设您希望与QML共享一个指向您的模型的指针
Q_属性
。所有Q_属性
s对QML自动可见
- 返回
时,也需要注册该类型。例如QSqlTableModel*
如果您需要:qmlRegisterUncreatableType<QSqlTableModel>( "NameOfModuleInQML", 1, 0, "QSqlTableModel", "Cannot instanciate QSqlTableModel from QML");
property QtObject mytabmodel
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);