[Qt] XRadioButton is drawn at original radio button location
This commit is contained in:
parent
18dfdce88e
commit
761f3a4735
|
@ -9,8 +9,8 @@ namespace ui {
|
|||
namespace qt {
|
||||
|
||||
XRadioButton::XRadioButton(QWidget* parent)
|
||||
: Themeable<QRadioButton>("XRadioButton", parent) {
|
||||
setFocusPolicy(Qt::TabFocus); // disable retaining focus through mouse click
|
||||
: Themeable<QRadioButton>("XRadioButton", parent) {
|
||||
setFocusPolicy(Qt::TabFocus); // disable retaining focus through mouse click
|
||||
}
|
||||
|
||||
void XRadioButton::paintEvent(QPaintEvent* e) {
|
||||
|
@ -20,14 +20,48 @@ void XRadioButton::paintEvent(QPaintEvent* e) {
|
|||
// create rect for indicator box
|
||||
// rect must start at 1 as the painter draws either side of start offset so
|
||||
// starting at (0,0) would leave 2 sides cut off
|
||||
QRectF indicator_box = QRectF(1, 1, 16, 16);
|
||||
QRectF indicator_rect = style()->proxy()->subElementRect(
|
||||
QStyle::SE_RadioButtonIndicator, &option,
|
||||
this);
|
||||
QRectF indicator_box =
|
||||
QRectF(indicator_rect.x() + 1.0, indicator_rect.y() + 0.0, 16, 16);
|
||||
|
||||
// get original rect for radio button label
|
||||
|
||||
QRect label_rect = style()->proxy()->subElementRect(
|
||||
QStyle::SE_RadioButtonContents, &option, this);
|
||||
QStyle::SE_RadioButtonContents, &option,
|
||||
this);
|
||||
|
||||
QPainter painter(this);
|
||||
painter.setRenderHints(QPainter::Antialiasing);
|
||||
|
||||
QPen pen(border_color_);
|
||||
|
||||
if (hasFocus()) {
|
||||
pen.setColor(focus_color_);
|
||||
}
|
||||
|
||||
pen.setJoinStyle(Qt::MiterJoin);
|
||||
painter.setPen(pen);
|
||||
|
||||
painter.drawEllipse(indicator_box);
|
||||
|
||||
// paint checked inner box if radio button is checked
|
||||
if (isChecked()) {
|
||||
painter.setPen(Qt::NoPen);
|
||||
QBrush checked_brush = QBrush(checked_color_);
|
||||
QRectF checked_rect =
|
||||
QRectF(indicator_box.x() + (indicator_box.width() * 0.125),
|
||||
indicator_box.y() + (indicator_box.height() * 0.125),
|
||||
indicator_box.width() * 0.75, indicator_box.height() * 0.75);
|
||||
|
||||
painter.setBrush(checked_brush);
|
||||
painter.drawEllipse(checked_rect);
|
||||
|
||||
painter.setPen(pen);
|
||||
}
|
||||
|
||||
QFont font = this->font();
|
||||
painter.setFont(font);
|
||||
|
||||
QFontMetrics metrics(font);
|
||||
QRect font_rect = metrics.boundingRect(text());
|
||||
|
@ -38,32 +72,7 @@ void XRadioButton::paintEvent(QPaintEvent* e) {
|
|||
|
||||
label_rect.translate(label_indent_, 0);
|
||||
|
||||
QPainter painter(this);
|
||||
painter.setRenderHints(QPainter::Antialiasing);
|
||||
|
||||
QPen pen(border_color_);
|
||||
|
||||
if (hasFocus()) {
|
||||
pen.setColor(focus_color_);
|
||||
}
|
||||
painter.setFont(font);
|
||||
|
||||
pen.setJoinStyle(Qt::MiterJoin);
|
||||
painter.setPen(pen);
|
||||
|
||||
painter.drawEllipse(indicator_box.center(), 8, 8);
|
||||
|
||||
painter.drawText(label_rect, text());
|
||||
|
||||
// paint checked inner box if radio button is checked
|
||||
if (isChecked()) {
|
||||
painter.setPen(Qt::transparent);
|
||||
QBrush checked_brush = QBrush(checked_color_);
|
||||
QRectF checked_rect = QRectF(3, 3, 12, 12);
|
||||
|
||||
painter.setBrush(checked_brush);
|
||||
painter.drawEllipse(checked_rect.center(), 6, 6);
|
||||
}
|
||||
}
|
||||
|
||||
QSize XRadioButton::sizeHint() const {
|
||||
|
@ -74,6 +83,6 @@ QSize XRadioButton::sizeHint() const {
|
|||
return QRadioButton::sizeHint() + QSize(label_indent_, 0);
|
||||
}
|
||||
|
||||
} // namespace qt
|
||||
} // namespace ui
|
||||
} // namespace xe
|
||||
} // namespace qt
|
||||
} // namespace ui
|
||||
} // namespace xe
|
||||
|
|
Loading…
Reference in New Issue