Frage

Ich habe einen Brauch QWidget (tatsächlich abgeleitet von QAbstractButton), für das ich meine eigenen implementieren muss paintEvent. Wie verwende ich die Stylesheet -Informationen?

Angenommen, jemand definiert das folgende Stylesheet, das (direkt oder über die Vererbung) für meine benutzerdefinierte Klasse gilt:

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

In meinem paintEvent Methode, wie bekomme ich die richtige Hintergrundfarbe für den geprüften Zustand?

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
}

Ich nehme an, ich muss so etwas wie:

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

Wie kann ich den Pinsel für den Hintergrund für geprüfte Zustand verwenden, den QT aus den Style-Laken aufgelöst hat?

War es hilfreich?

Lösung

Ich konnte nie herausfinden, wie ich die gelösten Farbinformationen (und Polster-) Informationen erhalten konnte, konnte sie aber durch Malen von Teilelementen anderer Widgets in meine zusammenarbeiten. Das ist nicht exakt Was ich versucht habe und kann in anderen Fällen möglicherweise nicht funktionieren (wenn Ihr Widget nicht durch das Zusammenschneiden von Sachen zusammengesetzt werden kann, von denen QT weiß, wie man zeichnet).

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

Ich denke immer noch, dass es einen besseren Weg geben muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top