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();
});
posted @ 2023-02-27 21:32  一字千金  阅读(2011)  评论(1编辑  收藏  举报