Qt 避免QQuickView延迟的qml加载
这是我的情况。我正在尝试将qml与一个主要基于小部件的UI结合起来。为此,我将QQuickView与QWidget::createWindowContainer一起使用。我不能使用QQuickWidget,因为我需要将窗口转换为本机窗口,而QQuickWidget不喜欢这样。但回到问题上来 我的问题是,第一次显示视图时,加载大约需要半秒钟,导致非常明显的闪烁。之后,我可以隐藏/显示我想要的所有视图,它会立即显示。这只是qml第一次加载。我相当肯定是qml的加载导致了这个问题。因为我有两个不同的QQuickView,它们的qml与其源代码相同。但在其中任何一个加载一次后,另一个都不会立即显示问题 我尝试在视图上提前调用show(),以便及时加载它。但这会导致qml在任何小部件显示之前出现一小会儿 有没有人遇到过类似的问题?如何使QQuickView正常工作Qt 避免QQuickView延迟的qml加载,qt,qml,Qt,Qml,这是我的情况。我正在尝试将qml与一个主要基于小部件的UI结合起来。为此,我将QQuickView与QWidget::createWindowContainer一起使用。我不能使用QQuickWidget,因为我需要将窗口转换为本机窗口,而QQuickWidget不喜欢这样。但回到问题上来 我的问题是,第一次显示视图时,加载大约需要半秒钟,导致非常明显的闪烁。之后,我可以隐藏/显示我想要的所有视图,它会立即显示。这只是qml第一次加载。我相当肯定是qml的加载导致了这个问题。因为我有两个不同的Q
编辑:我使用的是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出现之前,我几乎看不出加载循环。