首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QWidget UI在使用QQuickWidget时冻结

QWidget UI在使用QQuickWidget时冻结
EN

Stack Overflow用户
提问于 2018-10-05 10:44:59
回答 1查看 605关注 0票数 0

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

主窗口是一个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 :问题如前所述

下面是一个可以重现问题的小代码示例。它的工作方式如下:

  1. 主屏幕是一个QWidget。用户界面在鼠标悬停时更新(颜色更改)
  2. 单击时,它切换到QQuickWidget
  3. 鼠标悬停更新QML用户界面(颜色变化)
  4. 单击时,它切换回QWidget
  5. 鼠标悬停不再更新UI (不改变颜色)

main.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
import QtQuick 2.0
import QtQuick.Controls 2.1

Button {
    text: "ButtonQML"
    id: root
    background: Rectangle {
        color: root.hovered ? 'green' : 'white'
    }
}

知道是什么导致的吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-05 11:24:41

我发现了问题。似乎我读的QQuickWidget文档不够好。

注意:使用QQuickWidget将禁用所有平台上的线程呈现循环。这意味着线程呈现的一些好处,例如动画类和vsync驱动的动画,将不可用。

我把我的QQuickWidget改成了QQuickView,一切都很正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52663856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档