怎么设置QTreeWidget的宽度

怎么设置QTreeWidget的宽度,第1张

那是因为点击QComboBox后QTreeWidget根据QComboBox的行高对QTreeWidget的行高做的修正。

void QTreeWidgetItem::setSizeHint ( int column, const QSize &size )

Sets the size hint for the tree item in the given column to be size. If no size hint is set, the item delegate will compute the size hint based on the item data.

This function was introduced in Qt 4.1.

(当没有设置Item大小的时候,Delegate 会根据item里的数据来调整item的大小)

做为一只程序猿你应该可以很轻松的略读这段帮助文档吧。

你可以使用setSizeHint对QTreeWidget的行高进行修改。

但是当要添加的窗口的最小大小超过了你设置的QSize以后。QTreeWidget就会使用所填加的窗口的大小。忽视我们设置的大小。

//根据内容自动设置列宽

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

}

}

1.基本用法:

初始化用基本用到的:

//this->setMouseTracking(true)

this->setRootIsDecorated(false)

this->setSelectionMode(QAbstractItemView::ExtendedSelection)

this->setStyleSheet("QTreeWidget::item{height:25px}") //设置行宽, 我也找不到提供的接口 setStyleSheet很强大建议看

this->setColumnWidth(0, 100) //设置列宽

this->setColumnCount(2)

QStringList lists

lists <<"NO" <<"name"

this->setHeaderLabels(lists)

for (int i=0i<10i++)

{

QStringList contentList

contentList <<QString("00%1").arg(i) <<"boy"

QTreeWidgetItem *pNewItem = new QTreeWidgetItem(this, contentList) //增加

pNewItem->setBackgroundColor(0, QColor(150,0,0))

pNewItem->setFont(0, QFont())

}

//pNewItemRoot->setExpanded(true) //展开子项

增加删除顶层用:

addTopLevelItem(QTreeWidgetItem*)

takeTopLeveltem(int)

topLevelItem(int)//返回

topLevelItemCount()

增加删除子层:

addChild(QTreeWidgetItem*)

addChildren(const QList<QTreeWidgetItem*>&)

takeChild(int)

takeChildren()

child(int) //返回

childCount()

2.进价:

//加checkbox, icon

pNewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |Qt::ItemIsEnabled)

pNewItem->setCheckState(0, Qt::Unchecked)

//pNewItem->setIcon(int , QIcon)

//向ITEM里放一些QT的控件,如QSpinBox,QComboBox,QPushButton等

this->setItemWidget(pNewItem, 0, new QSpinBox())

//获取某项的QRect, 有时候会很有用,如显缩略图:

QRect rect = this->visualItemRect(QTreeWidgetItem*)

//右键菜单重写

contextMenuEvent( QContextMenuEvent * event )或者使用信号itemPressed(QTreeWidgetItem*, int)

//对头的 *** 作,可以用QLabel或者QTreeWidgetItem对头进行初始化,

//隐藏头

header()->hide()

m_pHeaderView->setClickable(true) //能够发射sectionClicked(int)信号,可做菜单,显示隐藏列:setSectionHidden(int, bool)isSectionHidden(int)

m_pHeaderView->setMovable(true)

m_pHeaderView->setResizeMode(0, QHeaderView::Fixed) //固定列宽

m_pHeaderView->setDefaultSectionSize(100) //默认

//排序

treeWidget->setSortingEnabled(true)

treeWidget->header()->setSortIndicatorShown(true)

treeWidget->header()->setSortIndicator(0, Qt::AscendingOrder)

//要自定义就用信号

connect( treeWidget->header(), SIGNAL( sectionClicked(int) ), this, SLOT( sectionClickedSlot(int) ) )

在小项目里,使用qtreewidget完全足够,

如果想更多灵活用法请使用QTreeView等 MODEL/VIEW控件


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11355572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存