0

我正在尝试在QStyledItemDelegate. 我希望不使用原生外观绘制复选框,而是使用qApp->setStyleSheet(). 我不知道为什么,但是当我用QStyle::drawPrimitive- 它绘制控件时,它不会拾取全局 qss。

有没有解决方案,如何手动绘制具有应用程序样式的复选框?

以下代码和屏幕截图演示了我的问题:

复选框示例

第一个复选框是用 绘制的QStyle::drawPrimitive,第二个复选框是小部件。

#include <QApplication>
#include <QWidget>
#include <QStyle>
#include <QPainter>
#include <QStyleOptionButton>
#include <QCheckBox>

class TestWindow
    : public QWidget
{
    Q_OBJECT

public:
    TestWindow() {}
    ~TestWindow() {}

    void paintEvent( QPaintEvent * event )
    {
        QPainter p( this );

        QStyleOptionButton opt;
        opt.state |= QStyle::State_On;
        opt.state |= QStyle::State_Enabled;
        opt.rect = QRect( 10, 10, 20, 20 );

        style()->drawPrimitive( QStyle::PE_IndicatorCheckBox, &opt, &p, this );
    }
};

int main( int argc, char *argv[] )
{
    QApplication a( argc, argv );

    a.setStyleSheet( "QCheckBox::indicator{ border: 1px solid red; }" );

    TestWindow w;
    QCheckBox *cb = new QCheckBox( &w );
    cb->move( 10, 30 );

    w.show();

    return a.exec();
}

#include "main.moc"

注意:可以创建不可见的复选框并使用QPixmap::grabWidget,但是这种方法太重了。

4

2 回答 2

2

Qt 目前不支持这样的绘图:

警告:自定义 QStyle 子类目前不支持 Qt 样式表。我们计划在未来的某个版本中解决这个问题。

于 2013-10-02T16:24:42.743 回答
0
QPainter p( this );

QStyleOptionButton opt;
opt.state |= QStyle::State_On;
opt.state |= QStyle::State_Enabled;
opt.rect = QRect( 10, 10, 20, 20 );

QCheckBox cb(this); // create fake checkbox

style()->drawPrimitive( QStyle::PE_IndicatorCheckBox, &opt, &p, &cb); // pass a pointer to checkbox instead of "this"
于 2015-03-18T12:01:22.063 回答