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. How to refresh data on horizontal header of QTableWidget?
Forum Updated to NodeBB v4.3 + New Features

How to refresh data on horizontal header of QTableWidget?

Scheduled Pinned Locked Moved Solved General and Desktop
28 Posts 4 Posters 4.4k Views 2 Watching
  • 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.
  • tovaxT tovax

    @Christian-Ehrlicher
    Frequence has been modified to10Hz, and no difference from 100Hz.
    Best Regards!

    mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by
    #9

    @tovax
    Hi
    For each setHeaderData, you emit a headerDataChanged
    so i would guess on lots of view repaints are issued. (for each axisIndex)
    Since you always want to refresh whole header, i was wondering if you could test with
    delaying the headerDataChanged signal until after the loop.

    for (int32_t axisIndex = Axis::Index::Min; axisIndex <= Axis::Index::Max; axisIndex++) {
            tableModel->setHeaderData(axisIndex, Qt::Horizontal, posCmd.at(axisIndex), Qt::DisplayRole);
        }
     
    tableModel->HeaderChange(Axis::Index::Min, Axis::Index::Max ); // this issues the signal with 
                      headerDataChanged(orientation,Min,Max );
    
    
    tovaxT 1 Reply Last reply
    0
    • mrjjM mrjj

      @tovax
      Hi
      For each setHeaderData, you emit a headerDataChanged
      so i would guess on lots of view repaints are issued. (for each axisIndex)
      Since you always want to refresh whole header, i was wondering if you could test with
      delaying the headerDataChanged signal until after the loop.

      for (int32_t axisIndex = Axis::Index::Min; axisIndex <= Axis::Index::Max; axisIndex++) {
              tableModel->setHeaderData(axisIndex, Qt::Horizontal, posCmd.at(axisIndex), Qt::DisplayRole);
          }
       
      tableModel->HeaderChange(Axis::Index::Min, Axis::Index::Max ); // this issues the signal with 
                        headerDataChanged(orientation,Min,Max );
      
      
      tovaxT Offline
      tovaxT Offline
      tovax
      wrote on last edited by
      #10

      @mrjj
      Hi,
      According to your suggestion, I blocked "headerDataChanged" signal, and add this public function to Model Class:

      void MotionSheetTableModel::HeaderChange(int32_t first, int32_t last)
      {
          emit headerDataChanged(Qt::Horizontal, first, last);
      }
      

      But no significant improvement in test results.
      Is my understanding right, please?

      Best Regards!

      mrjjM 1 Reply Last reply
      0
      • tovaxT tovax

        @mrjj
        Hi,
        According to your suggestion, I blocked "headerDataChanged" signal, and add this public function to Model Class:

        void MotionSheetTableModel::HeaderChange(int32_t first, int32_t last)
        {
            emit headerDataChanged(Qt::Horizontal, first, last);
        }
        

        But no significant improvement in test results.
        Is my understanding right, please?

        Best Regards!

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by mrjj
        #11

        @tovax
        If by blocked you mean
        // emit headerDataChanged(orientation, section, section);
        and call your new function (HeaderChange) after the loop then we are on same page.

        Ok so that didnt speed it up. :(
        Im not sure how altering the list
        posCmdList[section] = QString::number(value.value<double>(), 'f', 2);
        would be slow.

        I think i would insert some timing functions
        (https://doc.qt.io/qt-5/qelapsedtimer.html is handy for that)
        and see where the time is spend.
        Now we know its not from pure updates so we need to find the spot where the time is used.

        Also 10 times pr second does not sound that massive but I would try other values to see
        where the sweet spot it.

        tovaxT 1 Reply Last reply
        0
        • mrjjM mrjj

          @tovax
          If by blocked you mean
          // emit headerDataChanged(orientation, section, section);
          and call your new function (HeaderChange) after the loop then we are on same page.

          Ok so that didnt speed it up. :(
          Im not sure how altering the list
          posCmdList[section] = QString::number(value.value<double>(), 'f', 2);
          would be slow.

          I think i would insert some timing functions
          (https://doc.qt.io/qt-5/qelapsedtimer.html is handy for that)
          and see where the time is spend.
          Now we know its not from pure updates so we need to find the spot where the time is used.

          Also 10 times pr second does not sound that massive but I would try other values to see
          where the sweet spot it.

          tovaxT Offline
          tovaxT Offline
          tovax
          wrote on last edited by
          #12

          @mrjj
          I add this debug code:

          bool MotionSheetTableModel::setHeaderData(int32_t section, Qt::Orientation orientation, const QVariant &value, int32_t role)
          {
              Q_UNUSED(orientation);
              if (role == Qt::DisplayRole) {
                  QElapsedTimer timer;
                  timer.start();
                  posCmdList[section] = QString::number(value.value<double>(), 'f', 2);
                  qDebug() << "MotionSheetTableModel::setHeaderData" << timer.nsecsElapsed();
                  // emit headerDataChanged(orientation, section, section);
              }
          
              return true;
          }
          

          Result as follow:

          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 27646
          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 27646
          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 28670
          MotionSheetTableModel::setHeaderData 53244
          MotionSheetTableModel::setHeaderData 31741
          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 28670
          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 27646
          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 28158
          MotionSheetTableModel::setHeaderData 28670
          MotionSheetTableModel::setHeaderData 27646
          MotionSheetTableModel::setHeaderData 28670
          MotionSheetTableModel::setHeaderData 28670
          

          Nanoseconds, It looks fast enough.

          Best Regards!

          1 Reply Last reply
          0
          • mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #13

            Hi
            Yes it does indeed look ok fast.
            I would then disable the new function to check if app still feels
            laggy and its related to View redrawing.
            ( not send the headerDataChanged signal)

            i know you wont see the updates then but its a ok test to see if you are stressing
            the event loop anyways.

            If app still laggy with View not repainting it means the event loop is stressed.

            tovaxT 3 Replies Last reply
            0
            • mrjjM mrjj

              Hi
              Yes it does indeed look ok fast.
              I would then disable the new function to check if app still feels
              laggy and its related to View redrawing.
              ( not send the headerDataChanged signal)

              i know you wont see the updates then but its a ok test to see if you are stressing
              the event loop anyways.

              If app still laggy with View not repainting it means the event loop is stressed.

              tovaxT Offline
              tovaxT Offline
              tovax
              wrote on last edited by
              #14

              @mrjj
              Hi,
              When not send the headerDataChanged signal, the app run smoothly.
              By the way, if the data display in the table cell, the app run smoothly too.

              1 Reply Last reply
              0
              • mrjjM mrjj

                Hi
                Yes it does indeed look ok fast.
                I would then disable the new function to check if app still feels
                laggy and its related to View redrawing.
                ( not send the headerDataChanged signal)

                i know you wont see the updates then but its a ok test to see if you are stressing
                the event loop anyways.

                If app still laggy with View not repainting it means the event loop is stressed.

                tovaxT Offline
                tovaxT Offline
                tovax
                wrote on last edited by
                #15

                @mrjj
                Here is the system time in relevent function:

                onPosCmd - start "22:06:33:908"
                setHeaderData 0 "22:06:33:908"
                setHeaderData 1 "22:06:33:908"
                setHeaderData 2 "22:06:33:909"
                setHeaderData 3 "22:06:33:909"
                setHeaderData 4 "22:06:33:909"
                setHeaderData 5 "22:06:33:910"
                setHeaderData 6 "22:06:33:910"
                setHeaderData 7 "22:06:33:910"
                setHeaderData 8 "22:06:33:911"
                setHeaderData 9 "22:06:33:911"
                setHeaderData 10 "22:06:33:911"
                setHeaderData 11 "22:06:33:911"
                setHeaderData 12 "22:06:33:912"
                setHeaderData 13 "22:06:33:912"
                setHeaderData 14 "22:06:33:912"
                setHeaderData 15 "22:06:33:913"
                onPosCmd - end "22:06:33:913"
                headerData 0 "22:06:33:953"
                headerData 1 "22:06:33:954"
                headerData 8 "22:06:33:956"
                headerData 9 "22:06:33:957"
                headerData 10 "22:06:33:958"
                headerData 11 "22:06:33:959"
                headerData 12 "22:06:33:960"
                headerData 13 "22:06:33:961"
                headerData 14 "22:06:33:962"
                headerData 15 "22:06:33:963"
                headerData 0 "22:06:33:976"
                headerData 1 "22:06:33:978"
                headerData 8 "22:06:33:980"
                headerData 9 "22:06:33:982"
                headerData 10 "22:06:33:984"
                headerData 11 "22:06:33:985"
                headerData 12 "22:06:33:987"
                headerData 13 "22:06:33:989"
                headerData 14 "22:06:33:990"
                headerData 15 "22:06:33:992"
                

                It doesn't seem to waste much time on signaling.

                1 Reply Last reply
                0
                • Christian EhrlicherC Offline
                  Christian EhrlicherC Offline
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by Christian Ehrlicher
                  #16

                  What resize mode do you use? And can you provide a small test example so we can run it e.g. with callgrind to see where the time is spend.

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  tovaxT 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    Hi
                    Yes it does indeed look ok fast.
                    I would then disable the new function to check if app still feels
                    laggy and its related to View redrawing.
                    ( not send the headerDataChanged signal)

                    i know you wont see the updates then but its a ok test to see if you are stressing
                    the event loop anyways.

                    If app still laggy with View not repainting it means the event loop is stressed.

                    tovaxT Offline
                    tovaxT Offline
                    tovax
                    wrote on last edited by
                    #17

                    @mrjj
                    From "setHeaderData" to "headerData" waste 40ms. Will this have an impact, please?

                    1 Reply Last reply
                    0
                    • Christian EhrlicherC Christian Ehrlicher

                      What resize mode do you use? And can you provide a small test example so we can run it e.g. with callgrind to see where the time is spend.

                      tovaxT Offline
                      tovaxT Offline
                      tovax
                      wrote on last edited by
                      #18

                      @Christian-Ehrlicher
                      Hi,
                      The resize mode is QHeaderView::Stretch, this is the config of tableView:

                          tableView = new QTableView(this);
                          tableView->setModel(tableModel);
                      
                          tableView->setFrameShape(QFrame::NoFrame);
                      
                          tableView->horizontalHeader()->setVisible(true); 
                          tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
                      
                          tableView->verticalHeader()->setVisible(true); 
                          tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
                      
                          tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
                          tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
                          tableView->setAlternatingRowColors(true);
                      
                      1 Reply Last reply
                      0
                      • Christian EhrlicherC Offline
                        Christian EhrlicherC Offline
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #19

                        @tovax said in How to refresh data on horizontal header of QTableWidget?:

                        The resize mode is QHeaderView::Stretch

                        Ok, this is at least not a problem for the update. So please provide a small testcase.

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        tovaxT 2 Replies Last reply
                        0
                        • Christian EhrlicherC Christian Ehrlicher

                          @tovax said in How to refresh data on horizontal header of QTableWidget?:

                          The resize mode is QHeaderView::Stretch

                          Ok, this is at least not a problem for the update. So please provide a small testcase.

                          tovaxT Offline
                          tovaxT Offline
                          tovax
                          wrote on last edited by
                          #20
                          This post is deleted!
                          1 Reply Last reply
                          0
                          • Christian EhrlicherC Christian Ehrlicher

                            @tovax said in How to refresh data on horizontal header of QTableWidget?:

                            The resize mode is QHeaderView::Stretch

                            Ok, this is at least not a problem for the update. So please provide a small testcase.

                            tovaxT Offline
                            tovaxT Offline
                            tovax
                            wrote on last edited by tovax
                            #21

                            @Christian-Ehrlicher
                            Here is the github link:
                            TableView
                            Best Regards!

                            1 Reply Last reply
                            1
                            • Christian EhrlicherC Offline
                              Christian EhrlicherC Offline
                              Christian Ehrlicher
                              Lifetime Qt Champion
                              wrote on last edited by
                              #22

                              @tovax: I'll give it a try today, thx

                              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                              Visit the Qt Academy at https://academy.qt.io/catalog

                              1 Reply Last reply
                              1
                              • Christian EhrlicherC Offline
                                Christian EhrlicherC Offline
                                Christian Ehrlicher
                                Lifetime Qt Champion
                                wrote on last edited by
                                #23

                                Looks like the culprit is that a header data change triggers a complete repaint through QAbstractItemView::updateGeometries() which is very expensive. It doesn't matter if you call headerDataChanged() once per section or completely - it's a delayed trigger.

                                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                Visit the Qt Academy at https://academy.qt.io/catalog

                                tovaxT 1 Reply Last reply
                                2
                                • Christian EhrlicherC Christian Ehrlicher

                                  Looks like the culprit is that a header data change triggers a complete repaint through QAbstractItemView::updateGeometries() which is very expensive. It doesn't matter if you call headerDataChanged() once per section or completely - it's a delayed trigger.

                                  tovaxT Offline
                                  tovaxT Offline
                                  tovax
                                  wrote on last edited by
                                  #24

                                  @Christian-Ehrlicher
                                  Hi,
                                  In other words, can't I update the data on the horizontal header, please?
                                  Best Regards!

                                  mrjjM 1 Reply Last reply
                                  0
                                  • tovaxT tovax

                                    @Christian-Ehrlicher
                                    Hi,
                                    In other words, can't I update the data on the horizontal header, please?
                                    Best Regards!

                                    mrjjM Offline
                                    mrjjM Offline
                                    mrjj
                                    Lifetime Qt Champion
                                    wrote on last edited by mrjj
                                    #25

                                    @tovax
                                    Hi
                                    Nope, not as fast as you wish.
                                    On my (albeit old) gamer pc, it uses 28% CPU to refresh it.
                                    So for less powerful system, you will have to find another way to do the same
                                    than using the headers. Its too expensive to be used in this way.
                                    ( even 'just' 10 times pr second )

                                    So basically its not a supported use case with Qt to have high-speed header refresh. That said you might be able to fix it with a custom HeaderView
                                    but if there is enough virtual function to override this behavior, i cannot say currently.

                                    1 Reply Last reply
                                    0
                                    • Christian EhrlicherC Offline
                                      Christian EhrlicherC Offline
                                      Christian Ehrlicher
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #26

                                      Or, as we said already more times - don't try to update at 100Hz - noone can ever read this...

                                      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                      Visit the Qt Academy at https://academy.qt.io/catalog

                                      1 Reply Last reply
                                      0
                                      • tovaxT Offline
                                        tovaxT Offline
                                        tovax
                                        wrote on last edited by
                                        #27

                                        OK, Thanks for both of you! I'll think about other ways.
                                        Best Regards!

                                        1 Reply Last reply
                                        0
                                        • tovaxT Offline
                                          tovaxT Offline
                                          tovax
                                          wrote on last edited by
                                          #28

                                          Solved:

                                          1. Derived from QAbstractTableModel + QTableView
                                          2. Create two QTableView, one for cell's data, another for header data.
                                          3. Frozen the first row of the QTableView used for header data, and refresh data in it (100Hz).
                                          4. (Refer to official demo: Frozen Column Example)
                                          1 Reply Last reply
                                          1

                                          • Login

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