Qt 避免QQuickView延迟的qml加载

Qt 避免QQuickView延迟的qml加载,qt,qml,Qt,Qml,这是我的情况。我正在尝试将qml与一个主要基于小部件的UI结合起来。为此,我将QQuickView与QWidget::createWindowContainer一起使用。我不能使用QQuickWidget,因为我需要将窗口转换为本机窗口,而QQuickWidget不喜欢这样。但回到问题上来 我的问题是,第一次显示视图时,加载大约需要半秒钟,导致非常明显的闪烁。之后,我可以隐藏/显示我想要的所有视图,它会立即显示。这只是qml第一次加载。我相当肯定是qml的加载导致了这个问题。因为我有两个不同的Q

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

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

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

有没有人遇到过类似的问题?如何使QQuickView正常工作


编辑:我使用的是Qt5.4.2,由于各种原因,我无法更新到新版本。

我想说的是,您可以使用与回答中相同的方法,但似乎即使这样也太早,无法加载QML。这很有意思,但我唯一能想到的是使用一个非常短的
计时器:

main.cpp

#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"
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线程被阻止时继续旋转。

我查看了您的解决方案,但后来注意到您使用了我无权访问的qml组件。对不起,我应该在问题中提到这一点。但希望这对其他有类似问题的人来说是有用的信息。您可以将导入QtQuick.Controls 2.0更改为导入QtQuick.Controls 1.3(或Qt 5.4.2发布的任何版本的控件),它应该也能正常工作。对不起,我的错。我一定是查错了什么。我尝试了你的解决方案,但遗憾的是,它无法解决我的问题。如果您有一个需要花费时间加载的复杂qml,这将非常有用。我的问题是,即使是一个非常简单的一键qml,第一次加载也需要一秒钟的时间。使用您的解决方案,加载程序本身需要一秒钟的时间来显示,在qml出现之前,我几乎看不出加载循环。