Merge pull request #21749 from kadet1090/qss-aware-checkbox-property-panel

This commit is contained in:
Benjamin Nauck
2025-06-04 12:31:49 +02:00
committed by GitHub
3 changed files with 23 additions and 14 deletions

View File

@@ -2278,6 +2278,8 @@ QListView::indicator,
QTableView::indicator,
QColumnView::indicator {
border: 1px solid #ffffff;
width: 12px;
height: 12px;
}
QTreeView::indicator:unchecked:disabled,

View File

@@ -2271,6 +2271,8 @@ QListView::indicator,
QTableView::indicator,
QColumnView::indicator {
border: 1px solid #1c1c1c;
width: 12px;
height: 12px;
}
QTreeView::indicator:unchecked:disabled,

View File

@@ -107,37 +107,42 @@ void PropertyItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
if (index.column() == 1 && property && dynamic_cast<PropertyBoolItem*>(property)) {
bool checked = index.data(Qt::EditRole).toBool();
bool readonly = property->isReadOnly();
QStyle* style = option.widget ? option.widget->style() : QApplication::style();
QPalette palette = option.widget ? option.widget->palette() : QApplication::palette();
QStyleOptionButton checkboxOption;
if (property->isReadOnly()) {
checkboxOption.state |= QStyle::State_ReadOnly;
} else {
checkboxOption.state |= QStyle::State_Enabled;
}
checkboxOption.state |= readonly ? QStyle::State_ReadOnly : QStyle::State_Enabled;
checkboxOption.state |= checked ? QStyle::State_On : QStyle::State_Off;
// draw the item (background etc.)
style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, option.widget);
// Draw the checkbox
checkboxOption.rect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkboxOption);
int leftSpacing = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr);
checkboxOption.rect = style->subElementRect(QStyle::SE_CheckBoxIndicator, &checkboxOption, option.widget);
int leftSpacing = style->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, option.widget);
QRect checkboxRect = QStyle::alignedRect(
option.direction, Qt::AlignVCenter,
checkboxOption.rect.size(),
option.rect.adjusted(leftSpacing, 0, -leftSpacing, 0)
);
checkboxOption.rect = checkboxRect;
QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkboxOption, painter);
// Draw a bright border on the checkbox to stand out
QColor borderColor = QApplication::palette().color(QPalette::BrightText);
painter->setPen(borderColor);
painter->drawRect(checkboxOption.rect.adjusted(0, 0, -1, -1));
style->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkboxOption, painter, option.widget);
// Draw the label of the checkbox
QString labelText = checked ? tr("Yes") : tr("No");
int spacing = QApplication::style()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, nullptr);
int spacing = style->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, nullptr, option.widget);
QRect textRect(
checkboxOption.rect.right() + spacing,
checkboxOption.rect.top(),
option.rect.right() - (checkboxOption.rect.right() + spacing),
checkboxOption.rect.height()
);
painter->setPen(option.palette.color(QPalette::Text));
painter->setPen(palette.color(QPalette::Text));
painter->drawText(textRect, Qt::AlignVCenter | Qt::AlignLeft, labelText);
}
else {