vs 加载32位控件 退出_Qml加载网络控件之小坑

本文介绍,解决使用QtCreator默认创建的一个空的Qml项目工程,从网络中加载Qml控件却一直没效果的问题。

1. 问题重现

  先看下main.cpp的main函数。

int main(int argc, char *argv[]){
    ...
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}

  我们再看看main.qml文件的内容。

import QtQuick 2.0
import QtQuick.Window 2.0
/* 从网络导入控件或js */
import "http://qthub.com/qt/qtcomponent"

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("网络加载控件@Qt君")

    /* 从网络中加载的控件 */
    RoundRectangleDemo { }
}

  运行后没效果就退出程序了。

2. 发现问题

  经过调试排除Qml网络控件的问题,找到了以下地方导致运行没效果的现象。

if (engine.rootObjects().isEmpty()) {
    return -1;
}

  rootObjects()一直为空,导致程序提前结束了。

3. 分析问题

  rootObjects()为空,那么上一句逻辑执行load()意味着未正确执行或未加载完成。

  查看QQmlApplicationEngine的load函数文档找到以下内容:

Remote urls are loaded asynchronously, listen to the objectCreated signal to determine when the object tree is ready.

  大概意思是「远端链接的加载是异步处理」,可以监听objectCreated信号以确定对象树何时准备就绪。

  最后得出:由于远端链接是异步加载导致rootObjects()未完成初始化而为空,进而退出了进程。

4. 解决问题

  注释下列代码。

if (engine.rootObjects().isEmpty()) {
    return -1;
}

  或改成这样:

QObject::connect(&engine,
                 &QQmlApplicationEngine::objectCreated,
                 [&app](QObject *obj, const QUrl &url) {
                    if (obj == NULL)
                        app.exit(-1);
                 });

  最后运行的效果:8e0b386252711435793a4116b8500de4.png

5. 关于更多

  • 公众号后台回复【入群】后在群文件可找到本文运行源码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值