Qtreewidget滚动条宽度根据内容自适应调整
1.1 组织树treewidget滚动条宽度根据内容自适应调整
Treewidget只有在多列时,才会自适应显示横向滚动条,并且根据内容自动调整滚动条的大小,为了实现任务列表自适应列宽;需要采用如下方法;信号槽连接treewidget单击、展开、收起信号,然后去重新调整treewidget的宽度;
connect(ui.treeWidget, &QTreeWidget::clicked, this, [=](QModelIndex index) { SlotResizeTreeWidget(); }); connect(ui.treeWidget, &QTreeWidget::expanded, this, [=](QModelIndex index) { SlotResizeTreeWidget(); }); connect(ui.treeWidget, &QTreeWidget::collapsed, this, [=](QModelIndex index) { SlotResizeTreeWidget(); });
slot_treeView_pressed实现方法如下所示:
void TreeTaskList::SlotResizeTreeWidget() { m_treeHoribarPos = ui.treeWidget->horizontalScrollBar()->value(); m_isItemClicked = true; ui.treeWidget->resizeColumnToContents(0); int count = ui.treeWidget->topLevelItemCount(); ui.treeWidget->horizontalScrollBar()->setSliderPosition(m_treeHoribarPos);//无效,因为resizeColumnToContents(0);不会立即生效
}
通过上述方法可以触发重新修改大小,但是会出现点击treewidget中一个item或者展开,都会重新调整大小,横向滚动条会自动跑到最左边,而我实际想的是滚动条位置不变;而且通过ui.treeWidget->resizeColumnToContents(0);,不会立刻改变滚动条位置,为了使SlotResizeTreeWidget()函数不去保存滚动条的位置,需要定义变量m_treeHoribarPos保存初始位置,然后再横向滚动条的响应函数中,再设置该位置,就可以保持横向滚动条不变了; 但是如果拖动横向滚动条的时候,还是可以改变滚动条的值,所以在SlotResizeTreeWidget()对变量赋值m_isItemClicked = true;表示是通过SlotResizeTreeWidget()引起的改变,对于鼠标拖动滚动条,则不设置原始值;
connect(ui.treeWidget->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(onLeftHorizontalScrollBarChange(int)));
void TreeTaskList::onLeftHorizontalScrollBarChange(int value) { if (m_isItemClicked) { ui.treeWidget->horizontalScrollBar()->setSliderPosition(m_treeHoribarPos); m_isItemClicked = false;//置为false } }
通过上述方法之后,还是存在问题,当展开多个TopLevelItem时,无法自适应调整多个TopLevelItem随着展开变化宽度;而且QtreeWidget使用的自定义widget无法横向伸展时,即宽度固定时,横向滚动条也不会随着QtreeWidget的内容而自适应变化;最后通过将插入Qtreewidget的自定义widget全部改为宽度可伸展的,并且右侧用一个横向弹簧去推动CaseItem展开,而我们自定义的控件按钮全部放在左侧的固定宽度的widget上,这样插入QtreeWidget的自定义CaseItem就可以根据内容自由伸缩,而固定的操作控件在左侧的widgetFix上,最后设置widgetFix的背景为透明,这个鼠标放上去之后不会有色差;
QWidget#widgetFix
{
background:rgba(255,255,255,0);
}
为了达到添加item之后,也自适应调整大小,而且横向滚动条位置不变;所以添加之后,也要调用SlotResizeTreeWidget();自适应调整QtreeWidget的大小;
connect(pCase->ui.pbCreateDir, &QPushButton::clicked, this, [=]() { AddEmptyFoldToList(topItem); SlotResizeTreeWidget(); });
最终效果如下图所示;无论怎么展开收起,横向滚动条都会自适应调整;改变前后效果对比;
connect(pCase->ui.pbCreateDir, &QPushButton::clicked, this, [=]() {AddEmptyFoldToList(topItem);SlotResizeTreeWidget();
});