
就在构造函数里面加上以下两行代码即可:
//根据内容自动设置列宽
ui->treeWidget->header()->setResizeMode(QHeaderView::ResizeToContents)
ui->treeWidget->header()->setStretchLastSection(false)
在解决完上述问题后,又遇到一个问题,就是用鼠标左键或者右键单击QTreeWidget里面的选项时,水平滚动条会自动跑到最左边,双击不会出现这个问题,详细查阅了QTreeWidget的实现代码,在其父类中有个事件处理函数void QAbstractItemView::timerEvent(QTimerEvent *event),加了一个滚动处理,这里真是有点晕了,它的注释就是“we only get here if there was no double click”,大家可以看下这里为什么要加这个滚动处理。
解决方法如下(我已经对QTreeWidget进行了二次封装,就直接在这上面改的,不封装照样可以实现,原理是一样的):
1.加两个变量,记录是否有选项被点击,一个记录点击时的水平滚动条位置
bool m_isItemClicked
int m_horizontalScrollBarPos
2.对两个事件进行处理
connect(ui->treeWidget->horizontalScrollBar(), SIGNAL(valueChanged(int)), this,SLOT(scrollbarchange(int)))
void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
m_isItemClicked = true
m_horizontalScrollBarPos = ui->treeWidget->horizontalScrollBar()->sliderPosition()
}
void MainWindow::scrollbarchange(int value)
{
if (m_isItemClicked)
{
ui->treeWidget->horizontalScrollBar()->setValue(m_horizontalScrollBarPos)
m_isItemClicked = false
}
}
treeWidget ->header() ->setMinimumSectionSize(500)把列的最小宽度设成了一个比较大的数,然后横向滚动条就出来了。
TreeView里不会自动去调节你的item的大小,Qt只是根据FontMetrics来改变你内部文本的样式而已。
而且你只是Item的内容太长,
并不是在View的整个viewport中占不下(大部分原因因为宽度或是长度)这样才会出现ScrollBar,
而且Qt::ScrollBarAsNeeded是作为View中ScrollBar策略的默认参数。。。
其次改变宽度以及根据内容自动改变宽度的函数是绝对有的,这个我觉得你自己看文档获取的会更多。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)