Как сделать отступ для заголовка QDockWidget, используя мой собственный стиль - PullRequest
1 голос
/ 08 марта 2012

Я хочу сделать отступ для заголовка 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;
      }
  };

Понятия не имею почему, но когда я применяю свой стиль, он никогда не сталкивается с этим , если . Если я отлаживаю метод, я получаю вывод только для двух разных элементов, которые являются кнопками в строке заголовка.

1 Ответ

1 голос
/ 08 марта 2012

subElementRect не вызывается для получения области заголовка для всех стилей.По крайней мере, стили XP, Vista и MacOSX напрямую используют QStyleOption::rect, который передается в качестве параметра функции drawControl для CE_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 }");

Правило «позиция» ничего не делает, но необходимо, потому что странностиль применяется только в том случае, если присутствуют некоторые другие категории правил.
Текст также должен быть выровнен по вертикали, потому что выравнивание кажется потерянным при использовании таблицы стилей.

...