Как удалить QPalette из QWidget

Согласно документации Qt QWidget:

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

У меня есть иерархия виджетов:

QMainWindow 'window'
     |_QGroupBox 'box'
          |_QLabel 'label'
          |_QLabel 'label2'

Так что если бы я позвонил box->setPalette(somePalette) новая палитра используется для рисования box, label а также label2

Теперь я хочу отменить это, т.е. я хочу box, label а также label2 использовать мою палитру по умолчанию, что легко, я называю box->setPalette(window->palette()) право?

Проблема с этим box технически все еще имеет пользовательский набор палитр (он делает глубокую копию палитры, которую вы передаете), если я изменю палитру window он больше не распространяется через box в label а также label2,

Итак, как мне на самом деле удалить палитру из box так что палитра проповеди восстановлена?

2 ответа

Решение

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

Вы можете использовать QWidget::setAttribute, чтобы явно установить или удалить Qt::WA_WindowPropagation флаг, чтобы убедиться, что палитра распространяется (или нет). Из моего опыта, который иногда требует QWidget::update() быть вызванным потом.

ОБНОВЛЕНИЕ: Есть также Qt::WA_SetPalette атрибут для включения / выключения отдельного обновления палитры виджетов. В этом конкретном случае нам нужно сначала распространить палитру на вложенные виджеты, как предложил автор в комментариях, например: box->setPalette(window->palette()); box->setAttribute(WA_SetPalette, false);,

Я знаю, что это старый вопрос, но все, что вам нужно сделать, чтобы отключить палитру, — это передать созданную по умолчанию QPalette следующим образом:myWidget->setPalette(QPalette())

Когда вы это сделаете,setPaletteфункция будет обрабатыватьWA_SetPaletteатрибут для вас и любой другой внутренний механизм, необходимый для того, чтобы все работало.

Я тестировал это в Qt6.5, но думаю, что это должно работать и в более старых версиях.

Другие вопросы по тегам