问题
I'm trying to draw a checkbox in QStyledItemDelegate
. I want checkbox to be drawng not with native look, but with style that specified with qApp->setStyleSheet()
. I don't know why, but when I draw control with QStyle::drawPrimitive
- it doesn't pick up global qss.
Are there any solutions, how to manually draw check box with application style?
Following code and screenshot demonstrate my problem:
First check box is draw with QStyle::drawPrimitive
, second check box is widget.
#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"
Note: it is possible to create invisible check box and use QPixmap::grabWidget
, but this method is too heavy.
回答1:
Qt currently does not support of such drawing:
Warning: Qt style sheets are currently not supported for custom QStyle subclasses. We plan to address this in some future release.
回答2:
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"
来源:https://stackoverflow.com/questions/19138100/how-to-draw-control-with-qstyle-and-with-specified-qss