如何QTreeWidget的水平滚动条自动出现

bingyu_2008 2012-05-31 10:38:15
为什么我添加的QTreeWidget,当我添加的QTreeWidgetItem的宽度超出QTreeWidget的宽度时,水平滚动条不会自动出现,只有在列宽拉大时才有水平滚动条呢?我只添加了一列。如何让QTreeWidget的水平滚动条根据每行的显示情况自动出现或者消失呢?
...全文
886 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我也碰到了这个问题,厉害!!!
superyang198608 2013-04-24
  • 打赏
  • 举报
回复
好贴,谢谢分享。
bingyu_2008 2012-06-07
  • 打赏
  • 举报
回复
这里把解决方法给大家分享一下:
就在构造函数里面加上以下两行代码即可:

//根据内容自动设置列宽
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;
}
}
shen_wei 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

怎么解决的能否共享一下啊?小弟也正纠结这个问题呢
[/Quote]

应该分享出来。。。大家共同学习!!
VideoMonitor 2012-06-05
  • 打赏
  • 举报
回复
怎么解决的能否共享一下啊?小弟也正纠结这个问题呢
bingyu_2008 2012-05-31
  • 打赏
  • 举报
回复
没有人遇到过此问题吗?
xiebin133 2012-05-31
  • 打赏
  • 举报
回复
结贴?
bingyu_2008 2012-05-31
  • 打赏
  • 举报
回复
已经解决了
bingyu_2008 2012-05-31
  • 打赏
  • 举报
回复
自己再帮顶一下

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧