Как удалить 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, но думаю, что это должно работать и в более старых версиях.