Пользовательский интерфейс QWidget зависает при использовании QQuickWidget - PullRequest
0 голосов
/ 05 октября 2018

Я работаю над программным обеспечением, которое использует 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: Проблема, как описано выше

Ниже приведен небольшой пример кода, который может воспроизвести проблему.это работает следующим образом:

  1. Домашний экран - это QWidget.Пользовательский интерфейс обновляется при наведении мыши (изменение цвета)
  2. при щелчке, он переключается на QQuickWidget
  3. Пользовательский интерфейс QML обновляется при наведении мыши (изменение цвета)
  4. при нажатии, этопереключается обратно на QWidget
  5. При наведении курсора мыши больше не обновляется интерфейс (без изменения цвета)

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'
    }
}

Есть идеи, что может вызвать это?

1 Ответ

0 голосов
/ 05 октября 2018

Я нашел проблему.Похоже, я недостаточно хорошо прочитал документацию QQuickWidget .

Примечание. Использование QQuickWidget отключает многопоточный цикл рендеринга на всех платформах.Это означает, что некоторые преимущества потокового рендеринга, например, классы Animator и анимации, управляемые vsync, будут недоступны.

Я изменил свой QQuickWidget на QQuickView и все работает.

...