Я создал подкласс QGraphicsView (для расширения функциональности) и поместил его в свой gui с помощью QtDesigner с повышением до необходимого класса.
Чтобы ускорить рендеринг графики, я решил установить vieport моего графического представления на QGLWidget ( но оставил все элементы сцены для рендеринга QPainter). Сделать это так, как было предложено Qt do c и другими людьми: ui->graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
К сожалению, из-за стиля gui основной виджет, который используется в качестве контейнера для размещения всех других виджетов в макетах, имеет атрибут setAttribute(Qt::WA_TranslucentBackground);
. Это сделано для эффекта тени в свернутом состоянии программы.
Проблема в том, что такая комбинация кода делает дыру в отображаемом gui (посмотрите на скриншот ниже).
Удаление этого флага дает необходимое ускорение отрисовки графики, но все таблицы стилей главного окна перестают работать (например, кнопки не реагируют на событие наведения).
Добавить:
Вот код, полностью воспроизводящий проблему:
`#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;
}`