Domanda

Ho un'usanza QWidget (In realtà, derivato da QAbstractButton) per il quale devo implementare il mio paintEvent. Come utilizzo le informazioni sul foglio di stile?

Ad esempio, supponiamo che qualcuno definisca il seguente foglio di stile che si applica (direttamente o tramite eredità) alla mia classe personalizzata:

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

Nel mio paintEvent Metodo, come si ottiene il colore di sfondo corretto per lo stato controllato?

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
}

Presumo di dover qualcosa come:

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());
}

Come faccio a ottenere il pennello da utilizzare per lo sfondo a stato controllato che QT ha risolto dai fogli di stile?

È stato utile?

Soluzione

Non ho mai potuto scoprire come ottenere le informazioni di colore risolto (e imbottitura), ma sono stato in grado di aggirarle dipingendo sotto-elementi di altri widget nei miei. Questo non è Esattamente Quello che stavo cercando di fare e potrei non funzionare in altri casi (se il tuo widget non può essere composto mettendo insieme cose che QT sa come disegnare).

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.
}

Penso ancora che ci debba essere un modo migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top