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

使用样式表属性在paintEvent中绘制Qt控件,qt,class,colors,qtstylesheets,Qt,Class,Colors,Qtstylesheets,Qt中是否有类或方法可以获取诸如“边框颜色”、“边框样式”等属性 这可用于基于当前选定的样式表创建和绘制自己的(衍生)控件 示例: QPushButton { border: 3px solid red; background: blue; margin: 5px; padding: 10px; } 守则: class QPushButtonCircle : public QPushButton { }; QpushButtonCille将是一个圆形按钮。甚至

Qt中是否有类或方法可以获取诸如“边框颜色”、“边框样式”等属性

这可用于基于当前选定的样式表创建和绘制自己的(衍生)控件

示例

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

class QPushButtonCircle : public QPushButton {
};
QpushButtonCille将是一个圆形按钮。甚至边界也是圆形的。边框应为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中创建所有者绘制控件的最佳方法是什么

我找不到任何方法可以期望在paintEvent中完整地绘制,而忽略任何样式表。但一定有更好的办法

Qt中的小部件是矩形,不能有任何其他形状。请看下面的图片。因此,任何其他方法都将与您尝试使用的方法一样棘手

使用

编辑:


我从未尝试过自己,但您可以尝试使用
QBitmap
QRegion
设置一个具有所需形状的。其他
css
元素(颜色等)可以通过更新样式表来设置。如果你能让它工作起来,你知道什么解决方案中的痛苦会小得多,因为你不需要处理定制的绘制事件。

Whoa,这将是一件非常好的事情,但是没有。也许你可以通过使用解析将它实现为
QString
css属性的包装器。但是如果不触及Qt内部,就很难处理这个问题:widget的
样式表
属性不是完整的计算样式:父项和qApp也会影响。可能是向Qt开发人员请求特性的原因…QGraphicsView也会完全忽略样式表。顺便说一句,QDial也是一个圆形控件,除了“背景色”之外,它忽略样式表,因为更改此颜色将更新该控件的调色板。Qt开发人员似乎只在这里使用调色板。设置背景色是我唯一可以从样式表中更改的属性。其他选项被忽略。您没有尝试使用圆形区域遮罩??我不久前测试了遮罩,但这并不能解决我的问题。遮罩仅保证某些零件不会绘制(且不可见)。例如,对于圆形按钮,这意味着整个边框是不可见的。这可能适用于特殊设计的闪屏,但不适用于控制装置。