Включить собственный виджет для таблицы стилей
Я хочу включить свой собственный класс виджетов для таблиц стилей, о котором я не говорю setStyleSheet(qss)
, но селекторы в таблице стилей qss. Понятно, что я должен заменить "::" на "-" в пространствах имен.
Здесь ( таблица стилей Qt для пользовательского виджета) я нашел похожий вопрос, но ему> 4 года. На основании ответа у меня есть несколько подробных вопросов:
а) Является ли опубликованный подход переопределенным paintEvent
все еще действителен (Qt5.6/5.7), с /questions/37794330/tablitsa-stilej-qt-dlya-polzovatelskogo-vidzheta/37794349#37794349
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
б) В той же теме ( /questions/37794330/tablitsa-stilej-qt-dlya-polzovatelskogo-vidzheta/37794347#37794347) сказано, мне не нужно переопределять paintEvent
, Хорошо, приводит меня к: b1) вредно ли переопределять paintEvent
во всяком случае, даже с QFrame
? б2) Что с другими базовыми классами, например QTableView
? Что делает QFrame
имея эту конкретную роль?
c) Кто-нибудь нашел официальную документацию Qt по этой теме. Хороший код, но откуда он взялся? ( здесь) Честно говоря, я не понимаю, что он делает.
-- Редактировать --
Даниил указал источник этого волшебного paintEvent
фрагмент здесь (QWidget
параграф). Интересно, что то же самое ("поддерживает только..") сказано для QDialog
Это может означать, что я должен использовать там и фрагмент. Я не понимаю, почему они не добавляют этот фрагмент в paintEvent
из QWidget
по умолчанию.
1 ответ
Является ли опубликованный подход с переопределенным paintEvent все еще действительным (Qt5.6/5.7)
- да
В той же теме ( /questions/37794330/tablitsa-stilej-qt-dlya-polzovatelskogo-vidzheta/37794347#37794347) сказано, мне не нужно переопределять paintEvent. Хорошо, приводит меня к: b1) вредно ли переопределять paintEvent в любом случае, даже с QFrame? b2) Что с другими базовыми классами, например, QTableView? Что делает QFrame такой особой ролью?
- Если вы подкласс
QFrame
, это обеспечивает свое собственное событие рисования.QFrame
это не особый случай, это относится ко всем виджетам. По умолчаниюQWidget::paintEvent
ничего не делает. Оно пустое. Вот почему вы должны переопределить его и предоставить свою собственную картину, чтобы включить таблицы стилей при создании подклассовQWidget
, Не вредно переопределятьQFrame
событие рисования, но вы потеряете поведение по умолчанию, если не вызоветеQFrame
с реализацией.
Кто-нибудь нашел официальную документацию Qt по этой теме. Хороший код, но откуда он взялся?
- Вот официальные документы. Если вы прокрутите немного вниз, он скажет:
QWidget
Поддерживает только свойства background, background-clip и background-origin. Если вы создаете подкласс от QWidget, вам нужно предоставить paintEvent для своего пользовательского QWidget, как показано ниже:
-
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}