Iglseder
Iglseder

Reputation: 53

QTableview - ResizeToContents queries every row?

Good afternoon,

I'm using a QTableview+QAbstractTableModel to display a potentially large amount of data (20k+ rows) were each row consists of cells holding text of various length, including newlines, displayed using a custom delegate. The data resides in memory (no database, stream or similar) and might be changed from outside the table. To adapt the row height to changes of the text, I set the Resize Mode of the TableView's vertical header to "ResizeToContents" which correctly uses the sizeHint of my delegate to set the height.

This works well and all, however depending on the size of the table the performance is abysmal (several minutes to load a large table). Once I turn off the resize mode, loading is as fast as lightning but of course the row height is incorrect (causing text with newlines to overlap rows, etc.). It seems that when using the auto-resize mode, every cell in every row is queried for the size hint, which takes a lot of time (confirmed by printing a debug msg in the sizeHint function of my delegate).

I wonder if this is the intended behaviour of the ResizeToContents mode, as I would assume that it would only be necessary to query the actually visible rows of the TableView - not all rows (as given by the rowCounts() call). As only a fraction of the rows are displayed at any one time, this would of course improve the performance noticeably. Is this a bug/shortcoming in the resize code or do I misunderstand something about this functionality? By the way, I'm using PyQt 4.10 so maybe this behaviour changed in newer versions?

Thanks in advance for all hints.

Upvotes: 3

Views: 1003

Answers (1)

cengizkrbck
cengizkrbck

Reputation: 704

If you set verticalHeader.sizeHint to ResizeToContents, on any row update ALL table will be processed to obtain new column width. This behaviour is life saver for most of us, if we don't have a large table that frequently update.

First, don't use resizeToContents size hint! Basic solution: use fixed size for columns with stretch option. (i think, it is not for you) Solution, i use: i have timer to call resizeColumnsToContents() slot at intervals of 2 seconds. Solution, optimized: You can optimize my solution to your case. Such as, you can wait until all row data updated to call resize slot.

Answer for your suggestion(resize for just visible items): it is not useful.

Upvotes: 1

Related Questions