Malen benutzerdefinierter Qwidget basierend auf Style Sheet Pseudo-State-Wert
-
28-10-2019 - |
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?
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.