Pregunta

Tengo una costumbre QWidget (en realidad, derivado de QAbstractButton) para el cual tengo que implementar mi propio paintEvent. ¿Cómo uso la información de la hoja de estilo?

Por ejemplo, suponga que alguien define la siguiente hoja de estilo que se aplica (directamente o mediante herencia) a mi clase personalizada:

QAbstractButton { font-weight: bold; background-color: red }
QAbstractButton:checked { background-color: blue }

En mi paintEvent Método, ¿cómo obtengo el color de fondo correcto para aparecer en el estado marcado?

void MyButton::paintEvent(QPaintEvent */*event*/) {
  ensurePolished();  // Don't think this is necessary...
  qDebug() << Q_FUNC_INFO << isChecked();  // This is showing the right value
  QStylePainter painter(this);
  painter.fillRect(rect(), painter.background());  // always red, even if checked
}

Supongo que tengo que algo como:

if (isChecked()) {
  // painter.fillRect(rect(), ???);
  // 
  // style()->drawPrimitive(???, ...);
  //
  // QStyleOptionButton opt;
  // opt.initFrom(this);
  // QBrush bg_brush = opt.???
  // painter.fillRect(rect(), bg_brush);
  //
  // ???
} else {
  painter.fillRect(rect(), painter.background());
}

¿Cómo consigo que el pincel se use para el fondo de estado marcado que QT resolvió desde las hojas de estilo?

¿Fue útil?

Solución

Nunca pude averiguar cómo obtener la información de color resuelto (y relleno), pero pude trabajar alrededor de ella pintando subelementos de otros widgets en el mío. Esto no es exactamente Lo que estaba tratando de hacer, y puede que no funcione en otros casos (si su widget no puede ser compuesto machacando cosas que QT sabe cómo dibujar).

void MyButton::paintEvent(QPaintEvent */*event*/) {
  QStylePainter painter(this);

  QStyleOptionButton opt;
  opt.initFrom(this);
  opt.state |= isChecked() ? QStyle::State_On : QStyle::State_Off;
  opt.text = text();

  painter.drawPrimitive(QStyle::PE_Widget, opt);

  QStyleOptionButton label_opt = opt;
  label_opt.rect =
      style()->subElementRect(QStyle::SE_CheckBoxContents, &opt, this);
  painter.drawControl(QStyle::CE_CheckBoxLabel, label_opt);

  // ... etc.
}

Todavía creo que tiene que haber una mejor manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top