如何删除QTreeView缩进

如何删除QTreeView缩进,qt,qt5,qtreeview,qtwidgets,Qt,Qt5,Qtreeview,Qtwidgets,我希望有一个QTreeView,在每个嵌套级别的左侧不增加缩进。我尝试设置QTreeView::setIndentation(0)。它删除缩进就像我想要的,但是它也隐藏了树箭头 默认行为: 有凹痕✗ 用箭✔ 设置缩进(0)后: 没有凹痕✔ 没有箭✗ 期望的行为: 没有凹痕✔ 用箭✔ 那么,如何实现第三个示例中所示的结果呢?是否有任何标准的方法来执行此操作,否则我将不得不重新实现QTreeView::paintEvent(),QTreeView::drawBranchs(

我希望有一个
QTreeView
,在每个嵌套级别的左侧不增加缩进。我尝试设置
QTreeView::setIndentation(0)
。它删除缩进就像我想要的,但是它也隐藏了树箭头


默认行为:
  • 有凹痕✗
  • 用箭✔


设置缩进(0)
后:
  • 没有凹痕✔
  • 没有箭✗


期望的行为:
  • 没有凹痕✔
  • 用箭✔



那么,如何实现第三个示例中所示的结果呢?是否有任何标准的方法来执行此操作,否则我将不得不重新实现
QTreeView::paintEvent()
QTreeView::drawBranchs()
,等等?

为了解决此问题,我使用了一个代理来翻译项目的绘制,并绘制箭头

#包括
BranchDelegate类:公共QStyledItemDelegate
{
公众:
使用QStyledItemDelegate::QStyledItemDelegate;
无效绘制(QPainter*painter、常量QStyleOptionViewItem和option、常量QModelIndex和index)常量覆盖{
QStyleOptionViewItem opt(选项);
if(index.column()==0)
opt.rect.adjust(opt.rect.height(),0,0,0);
QSTYLEDITMDELEGATE::油漆(油漆工、选项、索引);
if(index.column()==0){
QStyleOptionViewItem分支;
branch.rect=QRect(0,opt.rect.y(),opt.rect.height(),opt.rect.height());
branch.state=option.state;
const QWidget*widget=option.widget;
QStyle*style=widget?widget->style():QApplication::style();
样式->绘图原语(QStyle::PE_指示符分支、分支、画师、小部件);
}
}
};
类TreeView:公共QTreeView
{
公众:
树视图(QWidget*parent=nullptr):QTreeView(parent)
{
BranchDelegate*委托=新BranchDelegate(此);
setItemDelegate(委派);
设置缩进(0);
}
受保护的:
无效MousePresseEvent(QMouseEvent*事件)重写{
QModelIndex index=indexAt(事件->位置());
bool last_state=isExpanded(索引);
QTreeView::mousePressEvent(事件);
if(index.isValid()&&last_state==isExpanded(index))
setExpanded(索引,最后一个状态);
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
TreeView;
QFileSystemModel模型;
setRootPath(QDir::rootPath());
w、 setModel(&model);
w、 setRootIndex(model.index(QDir::homePath());
/*对于(int i=1;i
您需要重新实施它…只是个人意见,但。。。我认为你试图实现的目标可能会让用户感到非常困惑。在标有
所需行为:
的图像中,我如何知道
1
Test
的子目录还是
C:
的子目录?@G.M.我同意,在这个特定示例中,用户会非常困惑。但是,实际的树结构将具有更简单和静态的嵌套。例如,想象一下属性浏览器中的分组。