首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免QQuickView延迟加载

避免QQuickView延迟加载
EN

Stack Overflow用户
提问于 2016-09-05 09:35:36
回答 1查看 982关注 0票数 4

这是我的情况。我正在尝试将qml与主要基于小部件的UI结合起来。为此,我在QWidget::createWindowContainer容器中使用QQuickView。我不能使用QQuickWidget,因为我需要将窗口转换为本机窗口,而QQuickWidget不喜欢这样做。但回到问题上。

我的问题是,当第一次显示视图时,加载需要大约半秒钟的时间,从而导致非常明显的闪烁。在此之后,我可以隐藏/显示我想要的视图,它会立即显示。这只是第一次加载qml。我相当肯定是qml的加载导致了这个问题。因为我有两个不同的QQuickViews,它们与它们的源代码具有相同的qml。但是在它们中的任何一个加载一次之后,另一个就没有立即显示问题。

我试图尽早调用show(),以便及时加载它。但这会导致qml在显示任何小部件之前出现一小段时间。

有没有人遇到过类似的问题?我怎样才能让QQuickView表现出来。

编辑:我正在使用QT5.4.2,由于各种原因,我无法更新更新版本。

EN

回答 1

Stack Overflow用户

发布于 2016-09-05 11:38:00

我本来想说,您可以使用与this答案相同的方法,但是即使这样加载QML也为时尚早。这很麻烦,但我唯一能想到的就是使用一个非常短的Timer

main.cpp

代码语言:javascript
复制
#include <QtWidgets>
#include <QtQuick>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0) :
        QMainWindow(parent)
    {
        QQuickView *view = new QQuickView();
        QWidget *container = QWidget::createWindowContainer(view, this);
        container->setFocusPolicy(Qt::TabFocus);
        view->rootContext()->setContextProperty("window", view);
        view->setSource(QUrl("qrc:/main.qml"));
        setCentralWidget(container);
        resize(400, 400);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

#include "main.moc"

main.qml

代码语言:javascript
复制
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 2.0

Item {
    anchors.fill: parent

//    Connections {
//        target: window
//        onAfterSynchronizing: loader.active = true
//    }

    Timer {
        running: true
        repeat: true
        interval: 50
        onTriggered: {
            loader.active = true
        }
    }

    Loader {
        id: loader
        active: false
        sourceComponent: Column {
            anchors.fill: parent

            Repeater {
                model: 30000
                delegate: Button {
                    text: index
                }
            }
        }
    }

    BusyIndicator {
        running: loader.status === Loader.Null
        anchors.centerIn: parent
    }
}

为了简洁起见,我将“沉重”的QML丢弃到sourceComponent中,但您也可以使用source属性指向URL。

BusyIndicator在呈现线程上运行它的动画,因此它可以在GUI线程被阻塞时继续旋转。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39327692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档