qt - 避免 QQuickView 延迟 qml 加载

标签 qt qml

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

我的问题是第一次显示 View 时,加载需要半秒钟,导致非常明显的闪烁。之后我可以隐藏/显示所有我想要的 View ,它会立即显示。这只是 qml 的第一次加载。而且我很确定是 qml 的加载导致了问题。因为我有两个不同的 QQuickViews,它们的 qml 与它们的来源相同。但是在其中任何一个加载一次后,另一个立即显示没有问题。

我试图尽早调用 show() 以使其及时加载。但这会导致 qml 在显示任何小部件之前出现片刻。

有没有人遇到过类似的问题?我怎样才能让 QQuickView 运行起来。

编辑:我使用的是 Qt 5.4.2,由于各种原因我无法更新到较新的版本。

最佳答案

我想说您可以使用与 this 相同的方法答案,但似乎即使这样加载 QML 还为时过早。这很hacky,但我能想到的唯一另一件事是使用非常短的Timer :

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"

main.qml :
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 线程被阻塞时继续旋转。

关于qt - 避免 QQuickView 延迟 qml 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39327692/

相关文章:

qt - Qt4 中的 URL 编码

单击鼠标时图像中的 QT 像素位置

regex - QML 中时间输入的文本字段验证

QT QML 更改状态 C++

qt - 我应该使用哪个 QtQuick 版本号

qt - QML TableView rowDelegate styleData.row 未定义

python - 如何在带有繁忙指示器的 QProgressBar 上显示文本?

c++ - 如何使用 qmake 为单个源文件指定编译器标志?

c++ - 如何使用qt将数据插入sqlite

c++ - 尝试从资源加载 qml 时出错