我正在开发一个同时使用QQuickWidget和QWidget的软件。
主窗口是一个QWidget,它包含一个QQuickWidget,用于用OpenGL呈现东西。
QQuickWidget位于有时显示和隐藏的QFrame中。
问题是,当隐藏QFrame时,所有基于QWidget的UI都停止更新。
奇怪的是,只有UI冻结。如果您知道在哪里单击,软件仍然工作,只有UI不再更新。我认为可能是QML窃取了隐藏时不再可访问的呈现循环?
我在: Linux,Qt 5.11.2 :没有问题观察到Windows 10 64位,Qt 5.9 :问题如上面所描述的Windows 10 64位,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'
}
}知道是什么导致的吗?
发布于 2018-10-05 11:24:41
我发现了问题。似乎我读的QQuickWidget文档不够好。
注意:使用QQuickWidget将禁用所有平台上的线程呈现循环。这意味着线程呈现的一些好处,例如动画类和vsync驱动的动画,将不可用。
我把我的QQuickWidget改成了QQuickView,一切都很正常。
https://stackoverflow.com/questions/52663856
复制相似问题