这是我的情况。我正在尝试将qml与主要基于小部件的UI结合起来。为此,我在QWidget::createWindowContainer容器中使用QQuickView。我不能使用QQuickWidget,因为我需要将窗口转换为本机窗口,而QQuickWidget不喜欢这样做。但回到问题上。
我的问题是,当第一次显示视图时,加载需要大约半秒钟的时间,从而导致非常明显的闪烁。在此之后,我可以隐藏/显示我想要的视图,它会立即显示。这只是第一次加载qml。我相当肯定是qml的加载导致了这个问题。因为我有两个不同的QQuickViews,它们与它们的源代码具有相同的qml。但是在它们中的任何一个加载一次之后,另一个就没有立即显示问题。
我试图尽早调用show(),以便及时加载它。但这会导致qml在显示任何小部件之前出现一小段时间。
有没有人遇到过类似的问题?我怎样才能让QQuickView表现出来。
编辑:我正在使用QT5.4.2,由于各种原因,我无法更新更新版本。
发布于 2016-09-05 11:38:00
我本来想说,您可以使用与this答案相同的方法,但是即使这样加载QML也为时尚早。这很麻烦,但我唯一能想到的就是使用一个非常短的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线程被阻塞时继续旋转。
https://stackoverflow.com/questions/39327692
复制相似问题