2017-11-06 31 views
0

QTreeViewウィジェットのいくつかの列では、アイコンを使用します。アイコンがQt:QTreeView:ヘッダの中心アイコン

QVariant headerData (int section, Qt::Orientation orientation, int role) const{ 
    if(role == Qt::DecorationRole) 
    { 
     QIcon icon; 
     if (section == 0) { 
      icon.addFile(":/icon1"); 
     } else if (section == 1){ 
      icon.addFile(":/icon2"); 
     } 
    } 

    if(role == Qt::TextAlignmentRole) 
    { 
     return (Qt::AlignLeft + Qt::AlignVCenter); 
    } 

に設定されているヘッダーは次のようになります。私は、テキストとアイコンを整列する

enter image description here

。 TextAlignmentRoleは、テキストでは機能しますが、アイコンでは機能しません。どうやってやるの?

私はまた、デフォルトの配置を設定することで、試してみました:

m_treeview->header()->setDefaultAlignment(Qt::AlignCenter);が、運を。

答えて

1

アイコンをテキストの中央に配置するには、この特定のスタイルビヘイビアを作成するために独自のproxy styleを実装する必要があります。テキストの実装

void HeaderProxyStyle::drawControl(ControlElement oCtrElement, const QStyleOption *poStylrOptionption, QPainter *poPainter, const QWidget *poWidget) const 
    { 
     // Header label? 
     if (oCtrElement == CE_HeaderLabel) { 
      // YES - Allocate style option header 
      QStyleOptionHeader *poStyleOptionHeader = 
        (QStyleOptionHeader *) poStylrOptionption; 

      // Get header icon 
      QIcon oIcon = qvariant_cast<QIcon>(poStyleOptionHeader->icon); 

      // Icon is valid? 
      if(oIcon.isNull()){ 
       // No - Draw text header 
       QProxyStyle::drawControl(oCtrElement, poStylrOptionption, poPainter, poWidget); 
       return; 
      } 

      // Set icon size 16x16 
      QSize oIconSize = QSize(16,16); 

      // Get header section rect 
      QRect oRect = poStyleOptionHeader->rect; 

      // Create header icon pixmap 
      QPixmap oIconPixmap = oIcon.pixmap(oIconSize.width(),oIconSize.height()); 

      // Calculate header text width 
      int iTextWidth = poStyleOptionHeader->fontMetrics.width(poStyleOptionHeader->text); 

      QRect oCenterRec = QRect(oRect.left(), 
            oRect.top() + (oRect.height - iTextSize)/2, 
            oIconPixmap.width(),oIconPixmap.height()); 


      QRect oTextRect = QRect(oCenterRec.left()+ oIconSize.width(), 
           oCenterRec.top(), oCenterRec.width() + iTextWidth, oCenterRec.height()); 
      // Draw icon 
      poPainter->drawPixmap(oCenterRec, oIconPixmap); 
      // Draw text 
      poPainter->drawText(oTextRect, poStyleOptionHeader->text); 
      return; 
     } 
     QProxyStyle::drawControl(oCtrElement, poStylrOptionption, poPainter, poWidget); 

    } 

#include <QProxyStyle> 
#include <QPainter> 

class HeaderProxyStyle : public QProxyStyle 
{ 
public: 
    void drawControl(ControlElement oCtrElement, const QStyleOption * poStylrOptionption, QPainter * poPainter, const QWidget * poWidget = 0) const; 

}; 

センターのアイコンは、その後、あなたのツリービューで

// Set header style 
m_treeview->header()->setStyle(&m_oHeaderStyle); 
+0

@lauraponsをこのヘッダのスタイルを適用します。あなたはこの質問を持つ任意のより多くの助けが必要なのですか? – Simon

+0

私はこれをコードに統合する方法がわかりません(qtreewidgetから継承されたウィジェットはモデル/代理人とプロキシを使用しています)、素早く応答いただきありがとうございます。 – laurapons

+0

また、私のプロジェクトでモデルビュー構造を使ってみましたが、それを試してみました。統合するために、別々のクラス 'HeaderProxyStyle'を作成し、' m_treeview'を使っているスコープ内にプライベートメンバー 'HeaderProxyStyle m_oHeaderStyle'を追加し、スタイルをヘッダー 'm_treeview-> header() - > setStyle(&m_oHeaderStyle);に設定すると動作します。あなたも私があなたを助けることができるより多くのコードを投稿することができます。 – Simon

関連する問題