代码之家  ›  专栏  ›  技术社区  ›  laurapons

Qt:QTreeView:标题上的中心图标

  •  1
  • laurapons  · 技术社区  · 8 年前

    对于QTreeView小部件中的一些列,我使用了一个图标。图标设置为on

    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 回复  |  直到 8 年前
        1
  •  3
  •   Simon    8 年前

    为了使图标与文本居中,您必须实现自己的 proxy style 创建此特定样式行为。

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

    带文本实现的中心图标

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

    然后在树状视图中应用此标题样式

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