Я работаю над программным обеспечением, которое использует QQuickWidget
и QWidget
.
Главное окно - QWidget
, которое содержит QQuickWidget
, используемое для рендеринга материала с OpenGL.
QQuickWidget
находится в QFrame
, который иногда отображается, а иногда скрывается.
Проблема в том, что когда QFrame
скрыт, вся база пользовательского интерфейса на QWidget
перестает обновляться
Странно то, что только пользовательский интерфейс зависает.Если вы знаете, где нажимать, программное обеспечение по-прежнему работает, только пользовательский интерфейс больше не обновляется.Я думаю, возможно, что QML крадет цикл рендеринга, который больше не доступен, когда он скрыт?
Я проверял это на: Linux, Qt 5.11.2: проблем не наблюдалось Windows 10 64bit, Qt 5.9: Проблемакак описано выше Windows 10 64bit, Qt 5.11.2: Проблема, как описано выше
Ниже приведен небольшой пример кода, который может воспроизвести проблему.это работает следующим образом:
- Домашний экран - это QWidget.Пользовательский интерфейс обновляется при наведении мыши (изменение цвета)
- при щелчке, он переключается на QQuickWidget
- Пользовательский интерфейс QML обновляется при наведении мыши (изменение цвета)
- при нажатии, этопереключается обратно на QWidget
- При наведении курсора мыши больше не обновляется интерфейс (без изменения цвета)
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'
}
}
Есть идеи, что может вызвать это?