Qt QGraphicsView OpenGL viewport проблема - PullRequest
0 голосов
/ 25 мая 2020

Я создал подкласс QGraphicsView (для расширения функциональности) и поместил его в свой gui с помощью QtDesigner с повышением до необходимого класса.

Чтобы ускорить рендеринг графики, я решил установить vieport моего графического представления на QGLWidget ( но оставил все элементы сцены для рендеринга QPainter). Сделать это так, как было предложено Qt do c и другими людьми: ui->graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

К сожалению, из-за стиля gui основной виджет, который используется в качестве контейнера для размещения всех других виджетов в макетах, имеет атрибут setAttribute(Qt::WA_TranslucentBackground);. Это сделано для эффекта тени в свернутом состоянии программы.

Проблема в том, что такая комбинация кода делает дыру в отображаемом gui (посмотрите на скриншот ниже).

problem

Удаление этого флага дает необходимое ускорение отрисовки графики, но все таблицы стилей главного окна перестают работать (например, кнопки не реагируют на событие наведения).

Добавить:

Вот код, полностью воспроизводящий проблему:

`#include <QtOpenGL/QGL>

main_form::main_form(QWidget *parent)
    : QWidget(parent)
{
    setWindowFlag(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    resize(400, 300);

    effect = new QGraphicsDropShadowEffect;
    effect->setBlurRadius(25);
    effect->setOffset(0);
    setGraphicsEffect(effect);

    QHBoxLayout *main_lay = new QHBoxLayout;
    setLayout(main_lay);

    QWidget *handler = new QWidget(this);
    handler->setStyleSheet(QString("background-color: white;"));
    QTreeWidget *tree = new QTreeWidget(this);
    QGraphicsView *view = new QGraphicsView(this);

    main_lay->addWidget(handler);
    QHBoxLayout *handle_lay = new QHBoxLayout;
    handler->setLayout(handle_lay);
    handle_lay->addWidget(tree);
    handle_lay->addWidget(view);

    view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
}

main_form::~main_form()
{
    delete effect;
}`
...