LINUX.ORG.RU

Отображение виджетов на фоне OpenGL окна

 , ,


0

3

Имеется QMainWindow, на котором расположен osgQt::GLWidget. Мне необходимо поверх этого окна отобразить несколько виджетов. Этим виджетам я устанавливаю osgQt::GLWidget в качестве родителя и задаю им относительные координаты. Вначале я использовал аттрибут Qt::WA_TranslucentBackground, ибо это позволяло добиться требуемого мне эффекта.

Однако в этом случае результат был таким: http://i79.fastpic.ru/big/2016/0707/39/52ac2f4c9c2600ceb1192258ba0e3739.png То есть там, где должна быть прозрачность присутствует адская чернота.

Ок, убираем Qt::WA_TranslucentBackground. И ничего не меняется. То есть с отрисовкой самих виджетов проблем нет: кнопочки на месте, граница QFrame на месте, а вот там, где должна быть заливка QPalette::Window все та же чернота.

А если попытаться отобразить эти виджеты на фоне QGraphicsView с софтварным рендеринком, то вместо черноты таки прозрачность.

Вот сами виджеты:

class ControlObjectLabelWidget: public QFrame
{

    Q_OBJECT

public:

    ControlObjectLabelWidget(QWidget * parent = 0);

signals:

    void changed();

protected:

    void updatePosition();

private slots:

    void controlObjectChanged(DataTypes::Id controlObjectId);

private:

    QLabel * m_label;

};

ControlObjectLabelWidget::ControlObjectLabelWidget(QWidget * parent) :
    QFrame(parent)
{
    setFrameShape(QFrame::StyledPanel);

    QHBoxLayout * layout = new QHBoxLayout(this);
    m_label = new QLabel(this);
    layout->addWidget(m_label);

    layout->setContentsMargins(3, 3, 3, 3);
    layout->setSpacing(3);

    QObject::connect(Core::instance().eventController(), &EventController::controlObjectChanged,
                     this, &ControlObjectLabelWidget::controlObjectChanged);
}

Как видите, никакой прозрачности. В чем может быть проблема?


Мне кажется, единственный шанс - это вынести перекрывающие виджеты в отдельное окно без декораций (QWidget с нулевым parent, например), чтобы фон делал композитный менеджер (а без композитинга будет такая же непрозрачная хрень, но по крайней мере не хуже чем сейчас)

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Я так уже делала. Во-первых наблюдается падение fps в osg. Во-вторых я отлавливаю события MOVE и RESIZE, чтобы двигать виджет за «родителем», но при изменении размеров виджета при таскании dockable событие RESIZE не приходит.

Проблема-то кажется решаемой, ибо я готова отказаться от прозрачности. Все рисуется корректно, кроме QPalette::Window. Такое ощущение, что виджеты принудительно устанавливают себе атрибут Qt::WA_TranslucentBackground. Но это не так, я проверяла.

totik ()
Ответ на: комментарий от totik

Во-первых наблюдается падение fps в osg

Было бы странно, если бы его не было, тут скорее всего выбор идет между просто падением и катастрофическим падением

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Было бы странно, если бы его не было, тут скорее всего выбор идет между просто падением и катастрофическим падением

С виджетом, перекрывающим osgQt::GLWidget, но имеющим его в качестве родителя падение fps не наблюдается.

totik ()

Я нашла способ, как обойти проблему:

void ControlObjectLabelWidget::paintEvent(QPaintEvent * event)
{
    QPainter painter(this);
    painter.fillRect(this->rect(), QBrush(palette().color(QPalette::Window)));
    QFrame::paintEvent(event);
}

Но причина, увы, не ясна.

totik ()
Ответ на: комментарий от fluorite

Дык движок отрисовки на QPainter не совместим с опенгл

Здрасьте, QPainter вполне себе работает в QOpenGLWidget (QOpenGL2PaintEngineEx) и QGLWidget(QGL2PaintEngineEx)

annulen ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.