//根據內容自動設置列寬
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;
}
}