其他分享
首页 > 其他分享> > Qt QTreeView 选中节点不会拓展到整个宽度的解决办法

Qt QTreeView 选中节点不会拓展到整个宽度的解决办法

作者:互联网

在做设备列表的时候,发现QTreeView 被选中后不会拓宽到整个列宽,入下图

这就导致界面极其不美观,特别是需要对一些设备做一些特殊处理的时候,不如设置背景色等等;

 

解决办法:

1 QListView 不会出现这种情况,将列表改为ListView, 但是如果需要设备树递归展示的时候这种方法是不可行的;

2 通过重写QStyledItemDelegate代理类来实现,由于所有的item默认都是通过代理类QStyledItemDelegate来显示样式的,可以重写此类,并设置成treeView的itemDelegate即可;

(1) 重写QStyledItemDelegate ,由于我这里只需要将颜色扩充为整个列表的宽度,所以只重写paint 虚函数即可

class TreeViewDelegate :public QStyledItemDelegate
{
public:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        QStyledItemDelegate::paint(painter, option, index);

        //如果选中的话,将选中的rect拓展到最左端位置

        if (option.state & QStyle::State_Selected )
        {
            QRect rect(option.rect);
            rect.setLeft(0);
            QString text = index.data(Qt::DisplayRole).toString();
            painter->fillRect(rect, option.palette.highlight());
            painter->drawText(option.rect, Qt::AlignVCenter, text);
        }

        //如果之前设置了背景色,那么重绘背景色至整个宽度
        else if (index.data(Qt::BackgroundRole).canConvert<QBrush>())
        {
            QBrush brush = qvariant_cast<QBrush>(index.data(Qt::BackgroundRole));
            if (brush.color() == Qt::red)
            {
                QRect rect(option.rect);
                rect.setLeft(0);
                QString text = index.data(Qt::DisplayRole).toString();
                painter->fillRect(rect, brush);
                painter->drawText(option.rect, Qt::AlignVCenter, text);
            }
        }
    }
};

(2)  设置treeView 的delegate为重写后的TreeViewDelegate

    TreeViewWitchIconDelegate *del = new TreeViewWitchIconDelegate;
    m_treeRobotList->setItemDelegate(del);

 

 

实现效果如下:

 

标签:解决办法,option,index,QTreeView,painter,QStyledItemDelegate,rect,Qt
来源: https://blog.csdn.net/i7891090/article/details/99641496