更改 QCheckBox 指示器矩形颜色

Posted

技术标签:

【中文标题】更改 QCheckBox 指示器矩形颜色【英文标题】:Changing QCheckBox indicator rectangle color 【发布时间】:2015-06-07 12:34:37 【问题描述】:

我正在尝试仅更改 QCheckBox 指示矩形的颜色。

目前我成功绘制了矩形的右边和底线。 可能我在这里做错了什么。

这是我的代码:

CheckBoxWidget.cpp

CheckBoxWidget::CheckBoxWidget(QObject *poParent)
    : QItemDelegate(poParent)



void CheckBoxWidget::drawCheck( QPainter *painter,
                                const QStyleOptionViewItem &option,
                                const QRect & rect,
                                Qt::CheckState state) const

    QRect oCheckBoxRect =
            QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &option);

    painter->setPen(Qt::white);
    painter->drawRect(oCheckBoxRect);

    QItemDelegate::drawCheck(painter, option, oCheckBoxRect, state);

CheckBoxWidget.h

class CheckBoxWidget : public QItemDelegate

    Q_OBJECT

public:
    CheckBoxWidget(QObject *poParent = 0);
    virtual ~CheckBoxWidget();

protected:
    virtual void drawCheck( QPainter *painter,
                            const QStyleOptionViewItem &option,
                            const QRect &,
                            Qt::CheckState state) const;
;

有什么建议吗?

【问题讨论】:

【参考方案1】:

无需为此创建自定义委托。您可以使用stylesheets 来根据需要更改复选框或任何其他小部件的颜色。下面的样式表将为复选框矩形设置一个灰色的3px 边框。

QCheckBox::indicator 
    border: 3px solid #5A5A5A;
    background: none;

为了设置样式表,您可以使用Qt DesignersetStylesheet 函数。

为了设置特定的颜色,以下所有内容都有效:

border: 3px solid #5A5A5A;
border: 3px solid red;
border: 3px solid rgb(255, 120, 100);
border: 3px solid rgba(255,120,100, 50); // For alpha transparency

【讨论】:

这种方法的问题是它改变了复选框的整个外观,而不仅仅是按要求改变了边框颜色。在 Qt 元素上设置自定义样式表时,您需要为元素的每个部分提供样式。 可悲的是与上述相同的问题。我将禁用的 qcheckbox 背景设置为灰色,但我不再看到复选框的其余部分 - 主要是勾号。我该如何设计刻度? QRadioButton 也是如此。更改样式使单选按钮变为正方形:-(有什么想法可以在哪里找到有关这些按钮样式的信息? 现在面临同样的问题...这方面有进展吗? 同样的问题:设置指示器大小有效,但是当我尝试设置边框颜色时,选中状态看起来像未选中 当我在我的复选框上看不到任何指示符时,如何获得投票!【参考方案2】:

我能想到的最简单的方法是使用 QApplication 调色板来帮助更改复选框指示器的颜色。这使得您不必使用 QStyle 覆盖整个复选框小部件的所有状态。

这是我需要的代码类型

QPalette newPallete = myWidget->palette();
newPallete.setColor(QPalette::Active, QPalette::Background, myWidget->palette().text())
myWidget->setPalette(newPallete)

请参阅与样式按钮非常相似的另一个示例: Qt5 - setting background color to QPushButton and QCheckBox

【讨论】:

【参考方案3】:

@pnezis 的解决方案有勾号不再显示的问题。

我通过创建一个自定义小部件来解决此问题,在其中我将一个 QCheckBox(不带标签)和一个 QLabel 放在一起。

然后,在 QCheckBox 上,我调用

checkBox.setStyleSheet('background-color: rgba(255, 90, 90, 0.7);')

这会改变 QCheckBox 的颜色但仍显示刻度。

【讨论】:

以上是关于更改 QCheckBox 指示器矩形颜色的主要内容,如果未能解决你的问题,请参考以下文章

更改 QCheckBox 的背景颜色

在NavigationView中更新SelectionIndicator的颜色

如何自定义单个选项卡? (更改背景颜色、指示器颜色和文本颜色)

如何在企业架构师白板图中更改矩形元素的颜色

UIPageViewController:每页更改页面指示器/页面控件的颜色

如何更改 UITableView 的滚动指示器的颜色?