如何在qt中创建自定义TreeView并在ItemView的右侧放置分支?

问题描述 投票:0回答:1

我想要的是使用QTreeView用qt创建一个侧边栏,将分支放置在项目的右侧。像AdminLTE侧边栏一样:https://adminlte.io/themes/AdminLTE/index2.html#

我尝试了几种解决方案,每个解决方案都没有达到我想要的设计:

  1. 使用代表
  2. 派生TreeView类和重新实现DrawBranches
  3. 创建自定义ProxyStyle

重点是我来自Web开发背景,这样做非常容易!

编辑:

假设我们有一个愚蠢的ProxyStyle派生类,在以下情况下我应该怎么做:

void CustomStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{
    if (element == PE_IndicatorBranch) {
        // put this damn thing at right
    }
    else if(element == PE_PanelItemViewItem) {
        // put this at left
    }
    // else
    QProxyStyle::drawPrimitive(element, option, painter, widget);
}

或也许使用委托人:

void TreeItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    // for example translate branch!? what to do????
    QStyledItemDelegate::paint(painter, option, index);

}

或重新实现TreeView :: DrawBranches。无论哪种方式,都不知道该怎么做才能完全满足我的要求。

Edit2:] >>

现在是它,但是仍然不是我想要的,例如,悬停会取消行为:

sidebar.cpp

#include "sidebar.h"

#include <QMouseEvent>
#include <QPainter>
#include "sidebarstyle.h"
#include "sidebardelegate.h"

SideBar::SideBar(QWidget *parent)
    : QTreeView(parent)
{
    setStyle(new SideBarStyle);
    setItemDelegate(new SideBarDelegate(this));
    setHeaderHidden(true);
    setEditTriggers(QAbstractItemView::NoEditTriggers);
    //    setIndentation(40);
    resize(230, parent->height());
    setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding));

    //    QPalette palette;
    //    palette.setBrush(QPalette::Base, QColor(34, 45, 50));
    //    palette.setBrush(QPalette::Highlight, Qt::transparent);
    //    setPalette(palette);
    setStyleSheet("QTreeView::item {height: 50px;} QTreeView {background-color: #222d32; color: #b8c7ce; font-size: 14px; font-weight: 400;} QTreeView::branch:selected, QTreeView::item:selected, QTreeView::branch:hover, QTreeView::item:hover {background-color: #1e282c; color: #fff}");
    //    setStyleSheet("QTreeView {background-color: #222d32; color: #b8c7ce}");


}

void SideBar::mousePressEvent(QMouseEvent *event)
{
    QModelIndex index = indexAt(event->pos());
    bool lastState = isExpanded(index);
    QTreeView::mousePressEvent(event);
    setExpanded(index, !lastState);
}

void SideBar::drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const
{
    QTreeView::drawBranches(painter, rect, index);
}

sidebardelegate.cpp

#include "sidebardelegate.h"
#include <QPainter>
#include "state.h"

SideBarDelegate::SideBarDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{
    font.setFamily("FontAwesome");
    font.setPixelSize(28);

}

void SideBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    QStyledItemDelegate::paint(painter, option, index);
    if(index.column() == 0){
        QRect _branch = QRect(option.widget->width() - option.decorationSize.width() -25, option.rect.y() + option.rect.height() / 4, option.decorationSize.width() + 15, option.rect.height() / 2);
        //        QRect icon = QRect(5, option.rect.y() + option.rect.height() / 4, option.decorationSize.width(), option.rect.height() / 2);
        QModelIndex _index = index;
        int depth = 0;
        while ( _index.parent().isValid() )
        {
            _index = _index.parent();
            depth++;
        }
        //        if(index.parent().isValid()) {
        QRect icon = QRect(5 + option.decorationSize.width() * depth, option.rect.y() + option.rect.height() / 4, option.decorationSize.width() + 10, option.rect.height() / 2);
        //        }
        painter->setFont(font);
        if(option.state & QStyle::State_Children)
        {
            if(option.state & QStyle::State_Open)
            {
                //                painter->drawImage(_branch, QImage("/home/fisher/Pictures/Download.png"));
                painter->drawText(_branch, "\uf107");
            }
            else
            {
                //painter->drawImage(_branch, QImage("/home/fisher/Pictures/135210286.png"));
                painter->drawText(_branch, "\uf104");
            }
            switch (index.row()) {
            case 0:
                //                painter->drawImage(icon, QImage("/home/fisher/Pictures/135210286.png"));
                painter->drawText(icon, "\uf080");
                break;
            case 1:
                //                painter->drawImage(icon, QImage("/home/fisher/Pictures/images.png"));
                painter->drawText(icon, "\uf14a");
                break;
            case 2:
                //                painter->drawImage(icon, QImage("/home/fisher/Pictures/iamges.jpeg"));
                painter->drawText(icon, "\uf0c3");
                break;
            default:
                //                painter->drawImage(icon, QImage("/home/fisher/Pictures/images (1).png"));
                painter->drawText(icon, "\uf085");
            }
            if(option.state & QStyle::State_Selected) {
                QRect bar = QRect(0, option.rect.y(), 2, option.rect.height());
                painter->setBrush(QColor(60, 141, 188));
                painter->setPen(QColor(60, 141, 188));
                painter->drawRect(bar);
            }
        } else {
                        adjustDefaultTextColors(option, *painter);
            painter->drawText(icon, "\uf111");
            //painter->drawImage(icon, QImage("/home/fisher/Pictures/images (1).jpeg"));
        }
    }
}

void SideBarDelegate::adjustDefaultTextColors(const QStyleOptionViewItem &option, QPainter &painter)  const
{
    if(option.state & QStyle::State_MouseOver) {
        painter.setPen(QColor(255, 255, 255));
    } else {
        painter.setPen(QColor(138, 164, 175));
    }
}

sidebarstyle.cpp

#include "sidebarstyle.h"
#include <QStyleFactory>
#include <QStyleOption>
#include <QColor>

SideBarStyle::SideBarStyle()
    : QProxyStyle(QStyleFactory::create("linux"))
{
}

void SideBarStyle::drawPrimitive(PrimitiveElement element,
                                 const QStyleOption *option,
                                 QPainter *painter,
                                 const QWidget *widget) const
{
    if(element & PE_IndicatorBranch) {
        return;
    }
//    if(option->state & QStyle::State_HasFocus){
//        QStyleOptionViewItem myViewItemOption;
//        const QStyleOptionViewItem *viewItemOption =
//                qstyleoption_cast<const QStyleOptionViewItem *>(option);
//        if (viewItemOption) {
//            myViewItemOption = *viewItemOption;
//            myViewItemOption.palette.setBrush(QPalette::Highlight, QColor(30, 40, 44));
//            myViewItemOption.palette.setBrush(QPalette::HighlightedText, Qt::white);
//        }
//        QProxyStyle::drawPrimitive(element, &myViewItemOption, painter, widget);
//        return;
//    }
    QProxyStyle::drawPrimitive(element, option, painter, widget);

}

//void SideBarStyle::drawControl(ControlElement element,
//                               const QStyleOption *option,
//                               QPainter *painter,
//                               const QWidget *widget) const
//{
////    if(option->state & QStyle::State_HasFocus){
////        QStyleOptionViewItem myViewItemOption;
////        const QStyleOptionViewItem *viewItemOption =
////                qstyleoption_cast<const QStyleOptionViewItem *>(option);
////        if (viewItemOption) {
////            myViewItemOption = *viewItemOption;
////            myViewItemOption.palette.setBrush(QPalette::Highlight, QColor(30, 40, 44));
////            myViewItemOption.palette.setBrush(QPalette::HighlightedText, Qt::white);

////        }
////        QProxyStyle::drawControl(element, &myViewItemOption, painter, widget);
////        return;
////    }
//    QProxyStyle::drawControl(element, option, painter, widget);
//}

当前图片

“”

[我也从@eyllanesc借了一些帮助来回答这个问题:How to remove QTreeView indentation

我想要的是使用QTreeView用qt创建一个侧边栏,将分支放置在项目的右侧。像AdminLTE侧边栏一样:https://adminlte.io/themes/AdminLTE/index2.html#。我尝试了几个...

c++ qt qtreeview qtreewidgetitem qstyle
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.