1

我想缩进 QDockWidget 的标题而不添加空格。

#include <QStyle>
#include <QProxyStyle>
#include <iostream>

class my_style : public QProxyStyle
  {

  Q_OBJECT

  public:
    my_style (QStyle* style = 0) :
        QProxyStyle (style)
      {
      }
    virtual ~my_style ()
      {
      }

    virtual QRect subElementRect (SubElement element, const QStyleOption * option, const QWidget * widget = 0) const
      {
        QRect rect = QProxyStyle::subElementRect (element, option, widget);
        if (element == QStyle::SE_DockWidgetTitleBarText)
          {
            rect.adjust (50, 0, 0, 0);
          }
        //std::cerr << "debug:" << element << std::endl;
        return rect;
      }
  };

我不知道为什么,但是当我应用我的风格时,它从来没有遇到过if。如果我调试该方法,我只会得到两个不同元素的输出,它们是标题栏中的按钮。

4

1 回答 1

1

subElementRect不会调用来获取所有样式的标题区域。至少,XP、Vista 和 MacOSX 样式是直接使用QStyleOption::rect的,它作为参数传递drawControlCE_DockWidgetTitle.

要处理这两种情况,您还应该重新实现drawControl

void drawControl(ControlElement element, const QStyleOption *option, 
    QPainter *painter, const QWidget *widget) const
  {
    const QStyleOptionDockWidget *dockWidget;

    if(element == CE_DockWidgetTitle && 
        (dockWidget = qstyleoption_cast<const QStyleOptionDockWidget *>(option)))
      {
        QStyleOptionDockWidget copy = *dockWidget;
        copy.rect.adjust(50,0,0,0);
        // or you can add spaces in the title to avoid the border moving left too
        // copy.title = QString(50 / copy.fontMetrics.width(" "), QChar(' ')) + copy.title;
        QProxyStyle::drawControl(element, &copy, painter, widget);
        return;
      }
    QProxyStyle::drawControl(element, option, painter, widget);
  }


或者,您可以使用带有填充或边距的样式表:

dockWidget->setStyleSheet("::title { position: relative; padding-left: 50px;"
                          "          text-align: left center }");

“位置”规则什么都不做,但却是必要的,因为奇怪的是,只有在其他一些规则类别也存在时才会应用该样式。
文本也需要垂直重新对齐,因为使用样式表时对齐似乎丢失了。

于 2012-03-08T19:36:53.440 回答