我正在尝试在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
,但此方法太重了。
答案 0 :(得分:2)
Qt目前does not support这样的图纸:
警告:自定义QStyle目前不支持Qt样式表 子类。我们计划在将来的某个版本中解决此问题。
答案 1 :(得分: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"