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