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;
      }
  };

理由はわかりませんが、自分のスタイルを適用すると、そのスタイルに遭遇することはありませ。メソッドをデバッグすると、タイトルバーのボタンである2つの異なる要素の出力しか得られません。

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 に答える