改变 QCheckBox 指示器矩形颜色

3

我正在尝试仅更改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;
};

有什么建议吗?
4个回答

5
无需创建自定义委托。您可以使用样式表来更改复选框或任何其他小部件的颜色。以下样式表将为复选框矩形设置灰色 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

2
这种方法的问题在于它改变了复选框的整体外观,而不仅仅是所请求的边框颜色。当在Qt元素上设置自定义样式表时,需要为元素的每个部分提供样式。 - Anthony Hilyard
4
很遗憾出现了与上面相同的问题。我将我的禁用qcheckbox背景设置为灰色,但我不再看到复选框的其余部分 - 主要是勾号。我该如何设置勾号的样式?QRadioButton也是同样的问题。更改样式会使单选按钮变成正方形:-( 有什么想法在哪里找到关于这些按钮样式的信息? - Dariusz
现在面临同样的问题...这方面有任何进展吗? - nostradamus
同样的问题:设置指示器大小可以正常工作,但是当我尝试设置边框颜色时,选中状态看起来像未选中。 - vitperov
如果您更改了一个属性,则必须将它们全部设置。以下是所有属性的列表:http://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox - lenooh
4
这个怎么被点赞了呢?我在复选框上看不到任何提示标记啊! - greendino

2
我的解决方案是更改QCheckBox :: indicatorborder-color,然后通过使QCheckBox :: indicator:checkedbackground-color作为勾号的视觉替代来修复消失的勾号。
checkBox.setStyleSheet("\
    QCheckBox::indicator { border: 1px solid; border-color: yellow; }\
    QCheckBox::indicator:checked { background-color: green; }\
");

可以在这里找到更多的QCheckBox::indicator:<state>


1
我能想到的最简单的方法是使用QApplication颜色调色板来帮助改变复选框指示器的颜色。这样可以避免使用QStyle覆盖整个复选框小部件的所有状态。
这是实现我的需求的代码类型。
QPalette newPallete = myWidget->palette();
newPallete.setColor(QPalette::Active, QPalette::Background, myWidget->palette().text())
myWidget->setPalette(newPallete)

看这个与样式按钮非常相似的例子: Qt5 - 设置QPushButton和QCheckBox的背景颜色


0

@pnezis的解决方案存在一个问题,即不再显示勾选框。

我通过创建自定义小部件来解决这个问题,在其中放置了一个没有标签的QCheckBox和一个相邻的QLabel。

然后,在QCheckBox上调用

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

这可以改变QCheckBox的颜色,但仍然显示勾选框。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接