Включить собственный виджет для таблицы стилей

Я хочу включить свой собственный класс виджетов для таблиц стилей, о котором я не говорю 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);
}
Другие вопросы по тегам