Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Empty QTableWidget vertical header not showing up
Forum Update on Monday, May 27th 2025

Empty QTableWidget vertical header not showing up

Scheduled Pinned Locked Moved Solved General and Desktop
11 Posts 4 Posters 5.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    tomatoketchup
    wrote on 17 Jul 2018, 18:03 last edited by
    #1

    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!

    1 Reply Last reply
    1
    • S Offline
      S Offline
      SGaist
      Lifetime Qt Champion
      wrote on 17 Jul 2018, 20:06 last edited by
      #2

      Hi,

      IIRC, if you want the header to be there, then you have to have at least one row even if empty.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      T 1 Reply Last reply 18 Jul 2018, 22:32
      2
      • V Offline
        V Offline
        VRonin
        wrote on 17 Jul 2018, 20:38 last edited by VRonin
        #3
        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));

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        T 2 Replies Last reply 18 Jul 2018, 22:34
        6
        • S SGaist
          17 Jul 2018, 20:06

          Hi,

          IIRC, if you want the header to be there, then you have to have at least one row even if empty.

          T Offline
          T Offline
          tomatoketchup
          wrote on 18 Jul 2018, 22:32 last edited by
          #4

          @SGaist Too bad it can't be done, because it's really annoying. Thanks for the reply!

          1 Reply Last reply
          0
          • V VRonin
            17 Jul 2018, 20:38
            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));

            T Offline
            T Offline
            tomatoketchup
            wrote on 18 Jul 2018, 22:34 last edited by
            #5

            @VRonin Thank you for your reply! I'll try this and tell you if it works, and I'm sure it will.

            J 2 Replies Last reply 19 Jul 2018, 07:51
            0
            • T tomatoketchup
              18 Jul 2018, 22:34

              @VRonin Thank you for your reply! I'll try this and tell you if it works, and I'm sure it will.

              J Offline
              J Offline
              JonB
              wrote on 19 Jul 2018, 07:51 last edited by
              #6

              @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 QTableViews against QSql... models and I don't seem to have any trouble still showing the header even when there are no rows. I wonder how....

              S 1 Reply Last reply 19 Jul 2018, 08:14
              0
              • J JonB
                19 Jul 2018, 07:51

                @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 QTableViews against QSql... models and I don't seem to have any trouble still showing the header even when there are no rows. I wonder how....

                S Offline
                S Offline
                SGaist
                Lifetime Qt Champion
                wrote on 19 Jul 2018, 08:14 last edited by
                #7

                @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.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                J 1 Reply Last reply 19 Jul 2018, 08:16
                1
                • S SGaist
                  19 Jul 2018, 08:14

                  @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.

                  J Offline
                  J Offline
                  JonB
                  wrote on 19 Jul 2018, 08:16 last edited by JonB
                  #8

                  @SGaist
                  Ah, OK, QTableWidget has its own model, doesn't it? Whereas my case I was thinking of is a QTableView with a QSqlTableModel as its model, where the "empty row" would be more troublesome, right?

                  1 Reply Last reply
                  0
                  • T tomatoketchup
                    18 Jul 2018, 22:34

                    @VRonin Thank you for your reply! I'll try this and tell you if it works, and I'm sure it will.

                    J Offline
                    J Offline
                    JonB
                    wrote on 19 Jul 2018, 08:34 last edited by JonB
                    #9

                    @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, calls QStandardItemModel::setHorizontalHeaderLabels() (note that is on the model). Are you already using QTableWidget's own setHorizontalHeaderLabels()?

                    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.

                    T 1 Reply Last reply 19 Jul 2018, 21:17
                    0
                    • V VRonin
                      17 Jul 2018, 20:38
                      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));

                      T Offline
                      T Offline
                      tomatoketchup
                      wrote on 19 Jul 2018, 21:11 last edited by
                      #10

                      @VRonin It works like a charm! Thank you so much!!

                      1 Reply Last reply
                      0
                      • J JonB
                        19 Jul 2018, 08:34

                        @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, calls QStandardItemModel::setHorizontalHeaderLabels() (note that is on the model). Are you already using QTableWidget's own setHorizontalHeaderLabels()?

                        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.

                        T Offline
                        T Offline
                        tomatoketchup
                        wrote on 19 Jul 2018, 21:17 last edited by
                        #11

                        @JonB Thank you for your reply! No problem, I think I poorly explained the issue.

                        1 Reply Last reply
                        0

                        1/11

                        17 Jul 2018, 18:03

                        • Login

                        • Login or register to search.
                        1 out of 11
                        • First post
                          1/11
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved