qt - 如何删除 QTreeView 缩进
问题描述
我希望左侧QTreeView
没有缩进,每个嵌套级别都会增加。我试过设置QTreeView::setIndentation(0)
。它就像我想要的那样删除了缩进,但是它也隐藏了树箭头。
默认行为:
- 带缩进 ✗</li>
- 带箭头✔</li>
之后setIndentation(0)
:
- 没有缩进 ✔</li>
- 没有箭头✗</li>
期望的行为:
- 没有缩进 ✔</li>
- 带箭头✔</li>
那么如何才能实现第三个示例中显示的结果呢?是否有任何标准的方法,或者我将不得不重新实现QTreeView::paintEvent()
,QTreeView::drawBranches()
等?
解决方案
为了解决这个问题,我使用了一个委托来翻译项目的油漆,并绘制箭头。
#include <QtWidgets>
class BranchDelegate: public QStyledItemDelegate
{
public:
using QStyledItemDelegate::QStyledItemDelegate;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override{
QStyleOptionViewItem opt(option);
if(index.column() == 0)
opt.rect.adjust(opt.rect.height(), 0, 0, 0);
QStyledItemDelegate::paint(painter, opt, index);
if(index.column() == 0){
QStyleOptionViewItem branch;
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();
style->drawPrimitive(QStyle::PE_IndicatorBranch, &branch, painter, widget);
}
}
};
class TreeView: public QTreeView
{
public:
TreeView(QWidget *parent=nullptr):QTreeView(parent)
{
BranchDelegate *delegate = new BranchDelegate(this);
setItemDelegate(delegate);
setIndentation(0);
}
protected:
void mousePressEvent(QMouseEvent *event) override{
QModelIndex index = indexAt(event->pos());
bool last_state = isExpanded(index);
QTreeView::mousePressEvent(event);
if(index.isValid() && last_state == isExpanded(index))
setExpanded(index, !last_state);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TreeView w;
QFileSystemModel model;
model.setRootPath(QDir::rootPath());
w.setModel(&model);
w.setRootIndex(model.index(QDir::homePath()));
/*for (int i = 1; i< model.columnCount() ; ++i) {
w.hideColumn(i);
}*/
w.expandAll();
w.resize(640, 480);
w.show();
return a.exec();
}
推荐阅读
- solr - 如何在 Solr 中存储嵌套的关系数据
- python - 使用 Wordpress API 将数据作为图像上传到 Wordpress
- javascript - 无法显示 JavaScript 小部件
- python - 关于 Python 2.7 类、实例和变量范围的基本问题
- javascript - Selenium - 在无头 geckodriver 中禁用 javascript
- javascript - 在 if 条件之后,Javascript 未在 Jupyter 单元中执行
- node.js - 在 iframe 中加载时被 iOS Safari 阻止的身份验证 cookie
- sql - 基于另一个参数的条件 where 子句
- angular - 在移动角度7上滚动时防止关闭工具提示
- python - dill.dump_session 不能与 getpass 一起使用