我正在开发同时使用QQuickWidget
和QWidget
的软件。
主窗口是一个QWidget
,其中包含一个QQuickWidget
,用于使用OpenGL渲染内容。
QQuickWidget
在QFrame
中,有时显示,有时隐藏。
问题在于,当QFrame
隐藏时,基于QWidget
的所有UI都会停止更新
奇怪的是,只有UI冻结了。如果您知道要单击的位置,则该软件仍然可以运行,仅不再更新UI。我认为可能是QML窃取了隐藏时不再可访问的渲染循环吗?
我在上进行了测试: Linux,Qt 5.11.2:未发现问题 Windows 10 64bit,Qt 5.9:如上所述的问题 Windows 10 64bit,Qt 5.11.2:如上所述的问题
下面是一个小代码示例,可以重现该问题。它是这样工作的:
main.cpp
#include <QApplication>
#include "myMainWindow.hpp"
int main(int argc, char **argv) {
QApplication application(argc, argv);
MyMainWindow window;
window.show();
window.raise();
return application.exec();
}
myMainWindow.hpp
#include <QMainWindow>
#include <QStackedLayout>
class MyMainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MyMainWindow(QWidget *parent = nullptr);
~MyMainWindow(void){}
private:
QStackedLayout *layout;
public slots:
void switchToWidget(void);
};
myMainWindow.cpp
#include <QApplication>
#include <QDebug>
#include <QFrame>
#include <QMainWindow>
#include <QPushButton>
#include <QtQuickWidgets/QQuickWidget>
#include <QQuickItem>
#include <QQmlProperty>
#include "myMainWindow.h"
MyMainWindow::MyMainWindow(QWidget *parent) : QMainWindow(parent) {
// Central Widget
QFrame *central = new QFrame;
central->setFixedSize(300,300);
this->setCentralWidget(central);
// BUTTON - QWidget
QPushButton *buttonWidget = new QPushButton("WIDGET", central);
buttonWidget->setStyleSheet("QPushButton{"
" background-color: red;"
"}"
"QPushButton:hover{"
" background-color: yellow;"
"}");
// BUTTON - QQuickWidget
QQuickWidget *buttonQML = new QQuickWidget(central);
buttonQML->setResizeMode(QQuickWidget::SizeRootObjectToView);
buttonQML->setSource(QUrl("qrc:/qml/ButtonQML.qml"));
buttonQML->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
// Main Stack Layout
this->layout = new QStackedLayout(central);
this->layout->addWidget(buttonWidget);
this->layout->addWidget(buttonQML);
this->layout->setCurrentIndex(0);
// Stack siwtch
QObject::connect(buttonWidget, &QPushButton::clicked, [=](){
this->layout->setCurrentIndex(1);
});
QQuickItem *rootObject = buttonQML->rootObject();
QObject::connect(rootObject, SIGNAL(clicked()), this, SLOT(switchToWidget()));
}
void MyMainWindow::switchToWidget(void) {
this->layout->setCurrentIndex(0);
}
ButtonQML.qml
import QtQuick 2.0
import QtQuick.Controls 2.1
Button {
text: "ButtonQML"
id: root
background: Rectangle {
color: root.hovered ? 'green' : 'white'
}
}
有什么想法会导致这种情况吗?
答案 0 :(得分:0)
我发现了问题。似乎我对QQuickWidget Documentation的阅读不够充分。
注意:使用QQuickWidget会在所有平台上禁用线程渲染循环。这意味着线程渲染的某些好处(例如Animator类和vsync驱动的动画)将不可用。
我将QQuickWidget
更改为QQuickView
,一切正常。