4

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::drawControl, QStyle::drawPrimitive... 来绘制类似的东西,但尊重 QPainterPath (或更简单的原语)而不是假设矩形控件。

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

4

1 回答 1

0

我找不到任何方法期望在paintEvent中完全绘制并忽略任何样式表。但必须有更好的方法。

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

有一个使用QGraphicView的建议。

编辑:

我自己从未尝试过,但您可以尝试使用 a或 a在按钮顶部设置所需形状的遮罩。其他元素(颜色等)可以通过更新样式表来设置。如果您可以使其工作,那么您知道什么解决方案就不会那么痛苦,因为您不需要处理自定义绘制事件。QBitmapQRegioncss

于 2013-01-30T16:53:55.203 回答