这是我的情况。我正在尝试将 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/