qt注册单例至qml退出时崩溃(qmlRegisterSingletonType)

9 篇文章 0 订阅

qml中想要调用cpp文件中的方法时一般采用注册法,通过qmlRegisterType或qmlRegisterSingletonType将类注册到qml,此时所有的qml文件都可以调用该对象。需要调用的函数前应声明Q_INVOKABLE。

两个注册函数为:

qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName); 
单例
 int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QJSValue(* ) ( QQmlEngine *, QJSEngine * ) callback)

其中第一个参数为引入模块名称,第二三个为引入时填写的版本,第四个参数为调用时的名称。单例的最后一个参数则是一个回到函数,回调函数中用来返回调用对象指针。注册单例时崩溃的原因也正是因此。qmlengine会为每一个engine实例化一个对象,而不是整个应用公用一个指针。qml不再需要该对象时就会析构该对象,所以如果在回调函数中正常的返回静态成员变量就可能导致调用已经释放的对象,从而导致崩溃。解决方法可以是在回调函数中为每一个engine实例化。也可以设置QQmlEngine::setObjectOwnership();告知qml对象所有权在c++,无需管理,从而避免问题。

    auto instance= DataBaseDelegate::Instance();
    QQmlEngine::setObjectOwnership(instance, QQmlEngine::CppOwnership);
    return instance;

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将 MySQL 查询结果返回到 QML ListView 中,你需要编写一个可以从 MySQL 数据库中检索数据的 C++ 模块,并将其暴露给 QML。 以下是一个简的示,可以作为参考: 首先,你需要使用 Qt 的 MySQL 驱动程序来连接到数据库并执行查询。在 C++ 模块中,你可以编写一个函数来执行查询并返回结果。如: ```cpp QVariantList MySQLModule::query(QString queryString) { QVariantList resultList; QSqlQuery query; if(query.exec(queryString)) { while(query.next()) { QVariantMap result; result["column1"] = query.value(0).toString(); result["column2"] = query.value(1).toString(); resultList.append(result); } } return resultList; } ``` 在此示中,我们使用 QSqlQuery 类来执行查询,并将结果存储在 QVariantList 中。我们还将每行数据存储为 QVariantMap,其中键是列名,值是查询结果。这使得在 QML 中使用数据更加方便。 接下来,你需要将此模块暴露给 QML。你可以使用 QML 中的 Qt.createQmlObject 函数,将 C++ 模块实化为 QML 对象。如: ```qml import QtQuick 2.0 import QtQuick.Controls 1.0 import QtQuick.Window 2.0 Window { visible: true width: 640 height: 480 ListView { id: listView anchors.fill: parent model: MySQL.query("SELECT column1, column2 FROM myTable") delegate: Text { text: modelData.column1 + " - " + modelData.column2 } } Component.onCompleted: { var MySQL = Qt.createQmlObject("import MySQLModule 1.0; MySQLModule {}", listView) } } ``` 在此示中,我们创建了一个 ListView 组件,并使用 MySQL.query 函数从数据库中检索数据。我们使用 Text 组件作为 ListView 的委托,并将数据绑定到列1和列2的值。 最后,我们在组件完成使用 Qt.createQmlObject 函数创建 MySQL 模块的实,并将其传递给 ListView。这使得 ListView 可以访问 MySQL.query 函数并获取查询结果。 请注意,这只是一个简的示,你需要根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值