Columns auto-resize to size of QTableView
Solution 1
There is a header flag to ensure that the QTableView's last column fills up its parent if resized. You can set it like so:
table_view->horizontalHeader()->setStretchLastSection(true);
However, that does not resize the other columns proportionately. If you want to do that as well, you could handle it inside the resizeEvent of your parent thusly:
void QParent::resizeEvent(QResizeEvent *event) {
table_view->setColumnWidth(0, this->width()/3);
table_view->setColumnWidth(1, this->width()/3);
table_view->setColumnWidth(2, this->width()/3);
QMainWindow::resizeEvent(event);
}
QParent class is subclass of QMainWindow.
Solution 2
This code equally stretchs each columns so that they fit the table's width.
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
Docs:
- QHeaderView::setSectionResizeMode
- See resize modes here.
Solution 3
Widgets QTableView, QTreeView and their derived classes (such as QTableWidget) have this two usefull methods:
QHeaderView* horizontalHeader() const;
QHeaderView* verticalHeader() const;
If you open documentation for a class QHeaderView, you will find methods that set up appearance and behavior of row or column header for item views. You can resolve your problem by one of these methods:
-
void QHeaderView::stretchLastSection( bool stretch )
As Davy Jones mentioned.Example:
QTableView *table = new QTableView(); table->horizontalHeader()->setStretchLastSection(true);
-
void QHeaderView::setResizeMode( ResizeMode mode )
As mode you can set QHeaderView::Stretch or QHeaderView::ResizeToContents.
Unfortunately this method have a drawback - after it's apply you will not be able to change size of columns (or rows) manually (in GUI) or programmatically.Example:
QTableView *table = new QTableView(); table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
Solution 4
In PyQt5 you can achieve this in your table_widget by doing:
header = table_widget.horizontalHeader()
header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
Related videos on Youtube
![khajvah](https://i.stack.imgur.com/gb5O6.jpg?s=256&g=1)
khajvah
A bored web developer. Currently interested in: OS development Mathematics (though I don't have much knowledge in this subject) (maybe) Statistics What I hate: Corruption Email: [email protected]
Updated on August 15, 2020Comments
-
khajvah almost 4 years
I am new to Qt and I have just managed to make a QTableView work with my model. It has fixed 3 columns. When I open a window, it look ok but when i resize the window, the QTableView itself gets resized but columns' width remains the same. Is there any build-in way to make it work? I want columns to resize to fit the edges of QTableView every the the window gets resized.
-
Min Lin almost 11 yearsDo you always want the column widths to be the same? If not, you can stretch the last column's width by calling table->horizontalHeader()->setStretchLastSection(true);
-
-
khajvah almost 11 yearsI haven't tested the second part but first one worked, though I decided to make the window unresizable (made more sense to me)
-
jtbr over 6 yearsTo set proportional column widths, I found it easiest to override the resizeEvent as shown, but by subclassing the QTableView in question, rather than the QMainWindow.