使用QQuickWidget

时间:2018-10-05 10:45:00

标签: c++ qt qml qtquick2

我正在开发同时使用QQuickWidgetQWidget的软件。

主窗口是一个QWidget,其中包含一个QQuickWidget,用于使用OpenGL渲染内容。

QQuickWidgetQFrame中,有时显示,有时隐藏。

问题在于,当QFrame隐藏时,基于QWidget的所有UI都会停止更新

奇怪的是,只有UI冻结了。如果您知道要单击的位置,则该软件仍然可以运行,仅不再更新UI。我认为可能是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 UI在鼠标悬停(颜色更改)上更新
  4. 点击后,它会切换回QWidget
  5. 鼠标悬停不再更新UI (颜色不变)

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 :(得分:0)

我发现了问题。似乎我对QQuickWidget Documentation的阅读不够充分。

  

注意:使用QQuickWidget会在所有平台上禁用线程渲染循环。这意味着线程渲染的某些好处(例如Animator类和vsync驱动的动画)将不可用。

我将QQuickWidget更改为QQuickView,一切正常。