Empty QTableWidget vertical header not showing up
-
Hi everyone,
How to make the vertical header visible even if the QTableWidget is empty? I find it very annoying when the header shows and hides again and again. I'm writing a server, and the table contains a list of clients. When there are no clients, the vertical header disappears, which I'd like to avoid.
I've already tried the following:ui->clientsTable->verticalHeader()->setVisible(true);
But it doesn't work.
Thanks in advance!
-
Hi,
IIRC, if you want the header to be there, then you have to have at least one row even if empty.
-
class PersistentHeader : public QHeaderView{ Q_OBJECT Q_DISABLE_COPY(PersistentHeader) public: PersistentHeader(Qt::Orientation orientation,QWidget* parent= Q_NULLPTR):QHeaderView(orientation,parent){} QSize sizeHint() const Q_DECL_OVERRIDE{ const QSize original = QHeaderView::sizeHint(); if(original.width()>0 || original.height()>0) return original; ensurePolished(); QStyleOptionHeader opt; initStyleOption(&opt); opt.section = 0; QFont fnt =font(); fnt.setBold(true); opt.fontMetrics = QFontMetrics(fnt); opt.text = QStringLiteral("0"); if (isSortIndicatorShown()) opt.sortIndicator = QStyleOptionHeader::SortDown; return style()->sizeFromContents(QStyle::CT_HeaderSection, &opt, QSize(), this); } };
Then call something like
tableWidget->setVerticalHeader(new PersistentHeader(Qt::Vertical,tableWidget));
-
Hi,
IIRC, if you want the header to be there, then you have to have at least one row even if empty.
@SGaist Too bad it can't be done, because it's really annoying. Thanks for the reply!
-
class PersistentHeader : public QHeaderView{ Q_OBJECT Q_DISABLE_COPY(PersistentHeader) public: PersistentHeader(Qt::Orientation orientation,QWidget* parent= Q_NULLPTR):QHeaderView(orientation,parent){} QSize sizeHint() const Q_DECL_OVERRIDE{ const QSize original = QHeaderView::sizeHint(); if(original.width()>0 || original.height()>0) return original; ensurePolished(); QStyleOptionHeader opt; initStyleOption(&opt); opt.section = 0; QFont fnt =font(); fnt.setBold(true); opt.fontMetrics = QFontMetrics(fnt); opt.text = QStringLiteral("0"); if (isSortIndicatorShown()) opt.sortIndicator = QStyleOptionHeader::SortDown; return style()->sizeFromContents(QStyle::CT_HeaderSection, &opt, QSize(), this); } };
Then call something like
tableWidget->setVerticalHeader(new PersistentHeader(Qt::Vertical,tableWidget));
@VRonin Thank you for your reply! I'll try this and tell you if it works, and I'm sure it will.
-
@VRonin Thank you for your reply! I'll try this and tell you if it works, and I'm sure it will.
@tomatoketchup
Qt is not alone in having tables where if there are no rows the column headers do not show. I know there are similar among ASP.NET's table controls, and I too find it very irritating that they insist on some dummy blank row else they keep switching the headers on & off.You can't always follow @SGaist 's "you have to have at least one row even if empty". My tables are for SQL models, and it must have just whatever rows there are in the database, I can't add one.
Having said the above, the code I have uses
QTableView
s againstQSql...
models and I don't seem to have any trouble still showing the header even when there are no rows. I wonder how.... -
@tomatoketchup
Qt is not alone in having tables where if there are no rows the column headers do not show. I know there are similar among ASP.NET's table controls, and I too find it very irritating that they insist on some dummy blank row else they keep switching the headers on & off.You can't always follow @SGaist 's "you have to have at least one row even if empty". My tables are for SQL models, and it must have just whatever rows there are in the database, I can't add one.
Having said the above, the code I have uses
QTableView
s againstQSql...
models and I don't seem to have any trouble still showing the header even when there are no rows. I wonder how....@JonB said in Empty QTableWidget vertical header not showing up:
You can't always follow @SGaist 's "you have to have at least one row even if empty". My tables are for SQL models, and it must have just whatever rows there are in the database, I can't add one.
I agree with that statement, however, my suggestion was specific to this context:
QTableWidget
. -
@JonB said in Empty QTableWidget vertical header not showing up:
You can't always follow @SGaist 's "you have to have at least one row even if empty". My tables are for SQL models, and it must have just whatever rows there are in the database, I can't add one.
I agree with that statement, however, my suggestion was specific to this context:
QTableWidget
. -
@VRonin Thank you for your reply! I'll try this and tell you if it works, and I'm sure it will.
@tomatoketchup
I can only say that my code, which still shows the column headers (that is what you want, right?) when no rows in model, callsQStandardItemModel::setHorizontalHeaderLabels()
(note that is on the model). Are you already usingQTableWidget
's ownsetHorizontalHeaderLabels()
?EDIT:
self.tableWidget = QtWidgets.QTableWidget(0, 3) self.centralLayout.addWidget(self.tableWidget) self.tableWidget.setHorizontalHeaderLabels(["Col1", "Col2", "Col3"]) self.tableWidget.setVerticalHeaderLabels(["Row1", "Row2", "Row3"])
The above does show the column headers when no rows (QT 5.7). Maybe I'm confusing your "vertical" & "horizontal"? The above does not of course show any row headers as there are 0 rows, what would you expect; if you set the rows (e.g.
QtWidgets.QTableWidget(3, 3)
) then they do show. Just as if you had no columns (QtWidgets.QTableWidget(3, 0)
) the column headers would not show.EDIT2
Sorry, I'm only beginning to understand you do want a vertical/row header, not columns. My bad. And you want that to "take up room" even if there are no rows so nothing to show, that's your question, right? In which case obviously @VRonin | @SGaist 's suggestions are needed. -
class PersistentHeader : public QHeaderView{ Q_OBJECT Q_DISABLE_COPY(PersistentHeader) public: PersistentHeader(Qt::Orientation orientation,QWidget* parent= Q_NULLPTR):QHeaderView(orientation,parent){} QSize sizeHint() const Q_DECL_OVERRIDE{ const QSize original = QHeaderView::sizeHint(); if(original.width()>0 || original.height()>0) return original; ensurePolished(); QStyleOptionHeader opt; initStyleOption(&opt); opt.section = 0; QFont fnt =font(); fnt.setBold(true); opt.fontMetrics = QFontMetrics(fnt); opt.text = QStringLiteral("0"); if (isSortIndicatorShown()) opt.sortIndicator = QStyleOptionHeader::SortDown; return style()->sizeFromContents(QStyle::CT_HeaderSection, &opt, QSize(), this); } };
Then call something like
tableWidget->setVerticalHeader(new PersistentHeader(Qt::Vertical,tableWidget));
@VRonin It works like a charm! Thank you so much!!
-
@tomatoketchup
I can only say that my code, which still shows the column headers (that is what you want, right?) when no rows in model, callsQStandardItemModel::setHorizontalHeaderLabels()
(note that is on the model). Are you already usingQTableWidget
's ownsetHorizontalHeaderLabels()
?EDIT:
self.tableWidget = QtWidgets.QTableWidget(0, 3) self.centralLayout.addWidget(self.tableWidget) self.tableWidget.setHorizontalHeaderLabels(["Col1", "Col2", "Col3"]) self.tableWidget.setVerticalHeaderLabels(["Row1", "Row2", "Row3"])
The above does show the column headers when no rows (QT 5.7). Maybe I'm confusing your "vertical" & "horizontal"? The above does not of course show any row headers as there are 0 rows, what would you expect; if you set the rows (e.g.
QtWidgets.QTableWidget(3, 3)
) then they do show. Just as if you had no columns (QtWidgets.QTableWidget(3, 0)
) the column headers would not show.EDIT2
Sorry, I'm only beginning to understand you do want a vertical/row header, not columns. My bad. And you want that to "take up room" even if there are no rows so nothing to show, that's your question, right? In which case obviously @VRonin | @SGaist 's suggestions are needed.@JonB Thank you for your reply! No problem, I think I poorly explained the issue.