Виджет qt с полностью прозрачным фоном

Мне нужно создать виджет qt, который будет выступать в качестве родителя для некоторых других виджетов и будет их упорядочивать.

Теперь вопрос в том, как сделать фон полностью прозрачным?

Думал сделать так:

struct Imp
{
  Imp( QWidget *parent ) : thisWidget( new QWidget( parent ) )
  {
    thisWidget->setAttribute( Qt::WA_TranslucentBackground, true );
  }

  QWidget *thisWidget;
};

Как вы думаете, мне нужно установить атрибут, или он будет работать без него?


person BЈовић    schedule 25.11.2010    source источник
comment
Вам действительно нужен прозрачный фон или достаточно отсутствия фона? Это реальная разница: с прозрачным фоном ОС прикажет основному окну рисовать пиксели. Без фона ОС просто ожидает, что дети закрасят все окно.   -  person MSalters    schedule 25.11.2010
comment
@MSalters Этот виджет размещается в окне, и должны быть видны только дочерние виджеты этих виджетов. Все, что находится за этим виджетом (если оно не закрыто дочерним виджетом), должно быть видно.   -  person BЈовић    schedule 25.11.2010
comment
Я не уверен, что понимаю этот вопрос... по умолчанию в Qt4 QWidget ничего не будет рисовать для своего фона, и будут рисоваться только его дочерние элементы.   -  person Caleb Huitt - cjhuitt    schedule 02.12.2010
comment
@Caleb Да, похоже, это правильный ответ. Почему вы ответили комментарием?   -  person BЈовић    schedule 02.12.2010
comment
Я напишу ответ, но я подумал, что, должно быть, что-то упустил, поскольку поведение по умолчанию так легко наблюдать за работой.   -  person Caleb Huitt - cjhuitt    schedule 02.12.2010
comment
Возможный дубликат Сделать QWidget прозрачным   -  person Violet Giraffe    schedule 01.12.2017


Ответы (5)


По умолчанию в Qt4 QWidget ничего не отрисовывает для собственного фона, и будут отрисовываться только его дочерние элементы. Если вы хотите переопределить это, вам нужно специально указать виджету отрисовывать фон через одно из его свойств. Обратите внимание, что некоторые виджеты, производные от QWidget, автоматически рисуют фон.

person Caleb Huitt - cjhuitt    schedule 02.12.2010
comment
Что, если я просто хочу отключить ранее установленный фон (backgroundRole). - person Tomáš Zato - Reinstate Monica; 26.01.2016
comment
@TomášZato: Самый простой способ запросить и запомнить предыдущую настройку и использовать ее для ее восстановления. Один из самых сложных способов — запросить у виджета его родителя, получить фоновую роль родителя и установить ее в виджете. Все это сложно, если вам нужно оставить остальную часть палитры как есть. - person Caleb Huitt - cjhuitt; 27.01.2016

Я думаю, вы должны иметь возможность выполнять все необходимые настройки рисования, изменив стиль вашего виджета.

MyWidget {background-color: none;}

должно работать, таблицы стилей можно очень легко протестировать в дизайнере

person Harald Scheirich    schedule 27.11.2010
comment
Если вы сделаете это в QLineEdit, фон изменится с прозрачного на белый (я использую PyQt), даже нежелательно. Забавный эффект. Но я согласен с тем, что в большинстве случаев использование qss довольно удобно. - person Trilarion; 16.12.2014
comment
background-color из none мне не помогло, а transparent помогло. - person Richard Whitehead; 04.08.2020

Решение, которое сработало для меня (я устанавливал прозрачный фон для QTextEditor):

auto editorPalette = editorWidget->palette();
editorPalette.setColor(QPalette::Active, QPalette::Base, Qt::transparent);
editorPalette.setColor(QPalette::Inactive, QPalette::Base, Qt::transparent);
editorWidget->setPalette(editorPalette);
person Violet Giraffe    schedule 24.04.2017

Вы можете посмотреть на:

setAttribute( Qt::WA_NoSystemBackground, true );

а также

setAttribute( Qt::WA_OpaquePaintEvent, false );
person Dave    schedule 12.04.2017

Не знаю, решит ли это полностью вашу проблему, но это обсуждается в этой статье

Документация находится по адресу http://doc.qt.nokia.com/4.1/qwidget.html#transparency-and-double-buffering

Решение предназначено для Qt4.1, но должно быть актуальным.

person Martin Beckett    schedule 25.11.2010
comment
Из первой ссылки говорится об использовании setBackgroundRole(QPalette::NoRole). Как вы думаете, это сработает? - person BЈовић; 26.11.2010