2010-08-08 21 views
27

我不確定如何問這個問題,所以請隨時索取更多信息。如何確保QTableView中的列被調整到最大值

tableView->resizeColumnsToContents()似乎只會根據當前視圖中的數據調整所有列的大小。這意味着如果我在下面有更多的數據(單詞數量更長),那些單詞將被包裝(如果wordWrap屬性設置爲true)。

奇怪的是,如果我向下滾動到底部並刷新數據,tableView將正確調整這些列的大小。看起來好像tableView不知道下面有更長的文字。

所以,我的問題是,我如何確保這些列根據所有數據調整到最大值?

我的代碼

QSqlTableModel *model = new QSqlTableModel; 
model->setTable("item"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
model->select();  
tableResult->setModel(model);  
tableResult->setEditTriggers(QAbstractItemView::NoEditTriggers);  
tableResult->setSelectionBehavior(QAbstractItemView::SelectRows); 
tableResult->setSelectionMode(QAbstractItemView::SingleSelection);  
tableResult->resizeColumnsToContents(); 
tableResult->resizeRowsToContents(); 

更新1

我試過tableResult->scrollToBottom(),它只會重新調整基於在底部項目。所以,如果中間有更長的單詞,這些單詞將被包裝。

更新2

如果有人想明白我在說什麼,只是 download 這個例子。你會看到單擊PushButton會生成一個沒有正確調整大小的數據。

更新3

可能是一個錯誤:https://bugreports.qt.io/browse/QTBUG-9352

+0

我也有這個問題。只有可見的行才能調整大小。你有沒有找到解決這個問題的方法? – ComputerEngineer88 2012-08-14 16:34:00

回答

38

我設法找到這個問題的解決方法,你只需要調用resizeColumnsToContents()之前隱藏表。

舉一個例子:

tableResult->setVisible(false); 
tableResult->resizeColumnsToContents(); 
tableResult->setVisible(true); 
+1

+1美化!永遠不會想到... – 2013-10-30 13:07:29

+1

奇怪的是,'table.resizeColumnsToContents()'沒有隱藏/顯示錶的工作原理PyQt5 – zdimension 2016-06-05 11:17:06

+2

在Qt 5.6中'table.resizeColumnsToContents()'沒有隱藏/顯示錶 – Indraraj 2017-02-18 06:16:30

5

我認爲這是因爲QSqlTableModel的需求加載數據和視圖計算僅基於可用數據的列寬。如果你不需要你的列是用戶調整大小的,你可以試試這個:

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); 
+0

這不起作用。該列仍然沒有正確調整大小。我把代碼放在函數的最後。我也試過QList 作爲QStandardItemModel作爲模型的數據源。 – amree 2010-08-09 08:41:49

4

我用同樣的解決方法,因爲通過amree,這對於列寬偉大的工作描述,但tableView->resizeRowsToContents()是不能正常工作,如果任何屏幕外的列有應具有多細胞導致行高增加。

我查看了Qt源代碼,看起來某些計算取決於視口幾何。這似乎使一切工作正確的列和行:

#include <limits> 

tableView->setVisible(false); 
QRect vporig = tableView->viewport()->geometry(); 
QRect vpnew = vporig; 
vpnew.setWidth(std::numeric_limits<int>::max()); 
tableView->viewport()->setGeometry(vpnew); 
tableView->resizeColumnsToContents(); 
tableView->resizeRowsToContents(); 
tableView->viewport()->setGeometry(vporig); 
tableView.setVisible(true); 
+2

amree的答案幫助了我,但我同時遇到了自動調整行高的問題,並認爲未來的讀者可以將我的解決方案發布到與這個密切相關的問題上。我會說,比「基本上沒有」多一點。 – dougg3 2015-04-11 05:27:41

+0

非常好,我一直試圖解決這個問題這麼久! – 2016-03-20 18:59:01

相關問題