使用相关样式表属性在paintEvent中绘制Qt控件

时间:2013-01-30 15:14:51

标签: qt class colors qtstylesheets

Qt中是否有类或方法来获取“border-color”,“border-style”等属性......

这可能对基于当前选择的样式表创建和绘制自己的(派生的)控件很有用。

示例

QPushButton {
    border: 3px solid red;
    background: blue;
    margin: 5px;
    padding: 10px;
}

代码:

class QPushButtonCircle : public QPushButton {
};

QPushButtonCircle是一个循环的按钮。甚至边界也是圆形的。边框应为3像素宽,实心和红色。背景应为蓝色。

我发现没有任何方法可以期望在paintEvent中绘制,并忽略任何样式表。但必须有更好的方法。

最好的是:

QCssStyle cssStyle = widget->...->getCssStyle();

QPen border = cssStyle->border(QCssStyle::Top);
QBrush background = cssStyle->background();
QMargins margins = cssStyle->margins();
QMargins padding = cssStyle->padding();
...

这将允许我们绘制我们自己的控件,如:

QStylePainter p(this);

QRect r = rect();
r.adjust(cssStyle->margins().left(), ...);

p.setPen(cssStyle->border());
p.setBrush(cssStyle->brush());
p.drawEllipse(r);

r.adjust(cssStyle->padding().left(), ...);
p.drawText(r, ...);

更好的解决方案是使用QStyle::drawControlQStyle::drawPrimitive来绘制事物的方法...但是遵循QPainterPath(或更简单的基元)而不是假设矩形控件。

使用样式表中的派生颜色在Qt中创建所有者绘制控件的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

  

我发现没有任何方法可以期望在paintEvent中绘制,并忽略任何样式表。但必须有更好的方法。

Qt中的小部件是矩形,不能有任何其他形状。看看box model。因此,任何其他方式都将与您尝试使用的方式一样棘手。

There is a suggestion使用QGraphicView

编辑:

我从未尝试过自己,但您可以尝试使用QBitmapQRegion设置所需形状的mask on top of the button。可以通过更新样式表来设置其他css元素(颜色等)。如果您能够使用它,那么您知道解决方案的麻烦就更少了,因为您不需要处理自定义绘制事件。