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

Я хочу включить свой собственный класс виджетов для таблиц стилей, при этом я не говорю о setStyleSheet(qss), а о селекторах в таблице стилей qss. Понятно, что я должен заменить "::" на "--" в пространствах имен.

Здесь ( Таблица стилей Qt для пользовательского виджета ) я нашел аналогичный вопрос, но это > 4 года. На основании ответа у меня есть несколько подробных вопросов:

a) Является ли опубликованный подход с переопределенным paintEvent все еще действительным (Qt5.6/5.7), из https://stackoverflow.com/a/8817908/356726

void CustomWidget::paintEvent(QPaintEvent *)
 {
     QStyleOption opt;
     opt.init(this);
     QPainter p(this);
     style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
 }

б) В том же потоке ( https://stackoverflow.com/a/22094319/356726 ) сказано, что я не нужно переопределять paintEvent. Хорошо, приводит меня к: b1) вредно ли переопределять paintEvent в любом случае, даже с QFrame? б2) Что с другими базовыми классами, например. QTableView? Что заставляет QFrame играть именно эту роль?

c) кто-нибудь нашел официальную документацию Qt по этой теме. Хороший код в a, но откуда он взялся? (здесь) Честно говоря, я не понимаю, что он делает.

-- Редактировать --

Даниэль указал источник этого волшебного paintEvent фрагмента здесь (QWidget параграф). Интересно, что то же самое ("поддерживает только ..") сказано и для QDialog, что может означать, что я должен использовать фрагмент кода и там. Я не понимаю, почему они не добавляют этот фрагмент в paintEvent из QWidget по умолчанию.


person Horst Walter    schedule 21.06.2016    source источник
comment
а) doc.qt.io/qt-5/stylesheet-reference.html : поддерживает только свойства background, background-clip и background-origin. Если вы создаете подкласс QWidget, вам нужно предоставить paintEvent для вашего пользовательского QWidget, как показано ниже: я думаю, что он все еще действителен в Qt5.6/5.7.   -  person Daniel    schedule 22.06.2016
comment
Спасибо, вы нашли первоисточник того самого фрагмента кода. Обновлено выше.   -  person Horst Walter    schedule 22.06.2016


Ответы (1)


Действителен ли опубликованный подход с переопределенным событием paintEvent (Qt5.6/5.7)

  • да

В той же теме ( https://stackoverflow.com/a/22094319/356726 ) сказано: Мне не нужно переопределять paintEvent. Хорошо, приводит меня к: b1) вредно ли переопределять paintEvent в любом случае, даже с QFrame? б2) Что с другими базовыми классами, например. QTableView? Что заставляет QFrame играть именно эту роль?

  • Если вы подклассируете QFrame, он предоставляет свою собственную отрисовку событие. QFrame не является частным случаем, это относится ко всем виджетам. По умолчанию QWidget::paintEvent ничего не делает. Пусто. Вот почему вы должны переопределить его и предоставить собственное рисование, чтобы включить таблицы стилей при создании подкласса QWidget. Переопределить событие рисования QFrame не вредно, но вы потеряете поведение по умолчанию, если не вызовете реализацию QFrames.

Кто-нибудь нашел официальную документацию Qt по этой теме? Хороший код в a, но откуда он взялся?

  • Вот официальные документы. Если вы прокрутите немного вниз, то увидите: 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);
}
person thuga    schedule 22.06.2016
comment
Любая идея, почему не сделать эту paintEventimplementation по умолчанию для QWidget? - person Horst Walter; 22.06.2016
comment
@HorstWalter Потому что QWidget - пустой виджет. - person thuga; 22.06.2016