QProgressBar与样式表

QProgressBar with StyleSheet

本文关键字:样式 QProgressBar      更新时间:2023-10-16

我想有一个垂直的进度条,里面有垂直的(从上到下)文本。我想知道是否以及如何用样式表实现这一点。我不能改变整个应用程序的样式,也不能完全改变小部件的样式(没有"应用塑料样式解决方案"可用)。有人能给我举个例子吗?如果你知道其他的方法,也会很有帮助。

建议的答案太复杂了。它可以用更简单的方式完成(更少的代码)。

首先你应该子类化QProxyStyle。这应该或多或少像这样做(override drawControl):

class MyProxyStyle : public QProxyStyle
{
  public:
    void QStyle::drawControl(ControlElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0) const
    {
        if (element == CE_ProgressBarLabel) {
            // create coppy of style option:
            QStyleOptionProgressBar op(*static_cast<QStyleOptionProgressBar*>(option));
            // prepare style option for rotation
            op.rect = QTransform().rotate(-90).mapRect(op.rect);
            // optional: op.orientation = (op.orientation==Qt::Horizontal)?Qt::Vertical:Qt::Horizontal;
            painter->rotate(90);  // rotate painter 
            QProxyStyle::drawControl(element, &op, painter, widget);
            painter->rotate(-90); // restore painter state - its a must
            return;
        }
        QProxyStyle::drawControl(element, option, painter, widget);
    }
};

我可能把角度搞错了,但总体概念应该是清楚的。

注意,这是一个更好的方法,因为:

  • 代码很简单
  • 你不破坏样式,如果样式将被改变,所有应该看起来和填充正确(你没有使用硬编码的标签绘画)。

我认为最好的方法是将QProgressBar子类化,而不是使用样式表。

你有一个类似的例子在这里与QScrollbar,希望它会有所帮助;)

在滚动条上绘制文本

一个小括号,如果你想只对一个组件应用样式表,你必须这样写:

widgetType#widgetName
{
    ...
}