Qt-QQuickWidget setSource无需冻结UI

时间:2018-09-24 20:18:02

标签: c++ qt qml

我正在从事一个管理项目,在该项目中,我必须从数据库中管理客户数据,并且我必须添加一个地图小部件来显示客户的位置(通过从数据库中获取其坐标)。 我创建了一个小样机来学习如何使用QML + Map Plugin,因为我以前从未使用过它们,所以我决定使用QQuickWidget来显示我的Map(该地图的QML取自Qt的示例,并进行了一些修改)。 但是我遇到了一个问题,当我执行程序时,需要花费几分钟的时间来显示UI,我认为这与我缓慢的互联网连接有关以获取地图的数据以及所有信息,但是我在这里需要显示的是UI和eveything (执行数据库查询等)。 所以我需要的是在正常处理UI的同时执行Map的小部件(获取地图),以便用户可以选择,搜索,删除并做任何他想做的事情(该地图的小部件将为空,因为尚未加载),直到地图已经可以显示了。

这是我的代码: 主窗口:

ui->quickWidget->setSource(QUrl("qrc:/new/prefix1/main.qml"));
QObject *object = ui->quickWidget->rootObject();
object->setProperty("_title" , "Oslo");
object->setProperty("_x" , "59.93");
object->setProperty("_y" , "10.76"); 

地图的QML脚本(main.qml):

import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6

Item
{
    width: 512
    height: 512
    visible: true
    property var _x: 0
    property var _y: 0
    property string _title: ""

    Plugin
    {
        id: mapPlugin
        name: "osm"
    }

    Map
    {
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(_x , _y)
        zoomLevel: 15

        ListModel
        {
            id: locationModel
            ListElement {lat: 0; lon: 0; color: "blue"}
            ListElement {lat: 5; lon: 12.5; color: "green"}
            ListElement {lat: 10; lon: 25; color: "red"}
        }

        MapItemView
        {
            model: locationModel
            delegate: MapQuickItem
            {
                coordinate: QtPositioning.coordinate(_x , _y)
                anchorPoint: Qt.point(10 , 10)
                sourceItem: Column
                {
                    Image {source: "marker.png"}
                    Text {text: _title}
                }
            }
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现问题是由缺少OpenSSL库引起的。您可以阅读相关主题here

对我有用的解决方案:

  • https://indy.fulgan.com/SSL/下载.zip文件
  • 提取libeay32.dll和ssleay32.dll
  • 将它们复制到qt二进制文件夹(例如,在我的情况下\ QT \ Qt5.11.0 \ 5.11.0 \ mingw53_32 \ bin \)