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. formatting a QTableView header
Forum Updated to NodeBB v4.3 + New Features

formatting a QTableView header

Scheduled Pinned Locked Moved Unsolved General and Desktop
41 Posts 5 Posters 29.3k Views 4 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.
  • mzimmersM mzimmers

    @kshegunov: wow -- this is fairly involved stuff. So, do I need to create a bitmap image of a line to use as an icon that would be my delimiter? (Not sure why font or alignment matter, as I'm trying to modify a data row, not the format of the text in that row.)

    Thanks.

    kshegunovK Offline
    kshegunovK Offline
    kshegunov
    Moderators
    wrote on last edited by
    #6

    @mzimmers said in formatting a QTableView header:

    wow -- this is fairly involved stuff. So, do I need to create a bitmap image of a line to use as an icon that would be my delimiter? (Not sure why font or alignment matter, as I'm trying to modify a data row, not the format of the text in that row.)

    Not really, no. What you should start with is to use Qt::DisplayRole so not to get the weird header (currently it thinks it's an editor of sorts). As a second step you can set any of the mentioned roles to get more customized looks.

    Read and abide by the Qt Code of Conduct

    1 Reply Last reply
    0
    • mzimmersM Offline
      mzimmersM Offline
      mzimmers
      wrote on last edited by
      #7

      I made the change to DisplayRole, but I don't see a difference in the header. What is it supposed to look like?
      0_1541196185564_wifiui.PNG

      kshegunovK 1 Reply Last reply
      0
      • mzimmersM mzimmers

        I made the change to DisplayRole, but I don't see a difference in the header. What is it supposed to look like?
        0_1541196185564_wifiui.PNG

        kshegunovK Offline
        kshegunovK Offline
        kshegunov
        Moderators
        wrote on last edited by
        #8

        @mzimmers said in formatting a QTableView header:

        What is it supposed to look like?

        I imagined it would be gray after changing the role. Maybe it's just the style you're using. Try setting Qt::BackgroundRole to something to make it distinguishable. (assuming that's what you wanted to do in the first place).

        Read and abide by the Qt Code of Conduct

        1 Reply Last reply
        0
        • mzimmersM Offline
          mzimmersM Offline
          mzimmers
          wrote on last edited by
          #9

          OK, I clearly have no idea what I'm doing. The whole concept of these "roles" eludes me.

          I tried this, and it didn't work:

              ui->tableView->horizontalHeader()->setBackgroundRole(QPalette::Window);
          
          
          kshegunovK 1 Reply Last reply
          0
          • mzimmersM mzimmers

            OK, I clearly have no idea what I'm doing. The whole concept of these "roles" eludes me.

            I tried this, and it didn't work:

                ui->tableView->horizontalHeader()->setBackgroundRole(QPalette::Window);
            
            
            kshegunovK Offline
            kshegunovK Offline
            kshegunov
            Moderators
            wrote on last edited by
            #10

            Try something like this:

            m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, QBrush(Qt::red), Qt::BackgroundRole);
            

            Roles give information of what kind of data you are keeping (think of it as the item's properties).

            Read and abide by the Qt Code of Conduct

            1 Reply Last reply
            1
            • mzimmersM Offline
              mzimmersM Offline
              mzimmers
              wrote on last edited by
              #11

              Still no visible change. Do I need to do something to the table view to reflect the change to the model object?

              kshegunovK 1 Reply Last reply
              0
              • mzimmersM mzimmers

                Still no visible change. Do I need to do something to the table view to reflect the change to the model object?

                kshegunovK Offline
                kshegunovK Offline
                kshegunov
                Moderators
                wrote on last edited by
                #12

                That's very odd. Do you mind sharing the headerData method of your model? Or is the model QStandardItemModel?

                Read and abide by the Qt Code of Conduct

                1 Reply Last reply
                0
                • mzimmersM Offline
                  mzimmersM Offline
                  mzimmers
                  wrote on last edited by
                  #13

                  My model is defined like this:

                      QAbstractItemModel *m_model;    // the main model
                  

                  But it's initialized like this:

                  DeviceModel::DeviceModel(QObject *parent) : QObject(parent), m_model(new QStandardItemModel(this))
                  {
                      QString qs;
                      QStringList qsl;
                  
                      m_model->insertColumns(0, TAG_NBRTAGS);
                      m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, tr("Serial Number"), Qt::DisplayRole);
                      m_model->setHeaderData(TAG_MACADDRESS, Qt::Horizontal, tr("MAC Address"), Qt::DisplayRole);
                      m_model->setHeaderData(TAG_DEVICENAME, Qt::Horizontal, tr("Device Name"), Qt::DisplayRole);
                      m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, QBrush(Qt::red), Qt::BackgroundRole);
                  

                  Note the use of the QStandardItemModel in the c'tor. (I think VRonin gave me this code, way back when.)

                  Not sure if this is what you're asking for...

                  kshegunovK 1 Reply Last reply
                  0
                  • mzimmersM mzimmers

                    My model is defined like this:

                        QAbstractItemModel *m_model;    // the main model
                    

                    But it's initialized like this:

                    DeviceModel::DeviceModel(QObject *parent) : QObject(parent), m_model(new QStandardItemModel(this))
                    {
                        QString qs;
                        QStringList qsl;
                    
                        m_model->insertColumns(0, TAG_NBRTAGS);
                        m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, tr("Serial Number"), Qt::DisplayRole);
                        m_model->setHeaderData(TAG_MACADDRESS, Qt::Horizontal, tr("MAC Address"), Qt::DisplayRole);
                        m_model->setHeaderData(TAG_DEVICENAME, Qt::Horizontal, tr("Device Name"), Qt::DisplayRole);
                        m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, QBrush(Qt::red), Qt::BackgroundRole);
                    

                    Note the use of the QStandardItemModel in the c'tor. (I think VRonin gave me this code, way back when.)

                    Not sure if this is what you're asking for...

                    kshegunovK Offline
                    kshegunovK Offline
                    kshegunov
                    Moderators
                    wrote on last edited by kshegunov
                    #14

                    Yes, it is, but only partially. What does your DeviceModel::headerData contain? Does it just delegate to the QStandartItemModel's method?

                    Read and abide by the Qt Code of Conduct

                    1 Reply Last reply
                    0
                    • mzimmersM Offline
                      mzimmersM Offline
                      mzimmers
                      wrote on last edited by
                      #15

                      I'm not doing anything with the header except what I posted above. DeviceModel is my own class that has the actual Qt model as a member:

                      class DeviceModel : public QObject
                      {
                          Q_OBJECT
                      private:
                          QAbstractItemModel *m_model;    // the main model
                      
                      kshegunovK 1 Reply Last reply
                      0
                      • mzimmersM mzimmers

                        I'm not doing anything with the header except what I posted above. DeviceModel is my own class that has the actual Qt model as a member:

                        class DeviceModel : public QObject
                        {
                            Q_OBJECT
                        private:
                            QAbstractItemModel *m_model;    // the main model
                        
                        kshegunovK Offline
                        kshegunovK Offline
                        kshegunov
                        Moderators
                        wrote on last edited by
                        #16

                        @mzimmers said in formatting a QTableView header:

                        I'm not doing anything with the header except what I posted above. DeviceModel is my own class that has the actual Qt model as a member.

                        Indeed. My bad, sorry. It's rather odd. As far as I can tell this should be enough to have your header have a red background. As a follow up question: Do you use style sheets?

                        Read and abide by the Qt Code of Conduct

                        mzimmersM 1 Reply Last reply
                        0
                        • kshegunovK kshegunov

                          @mzimmers said in formatting a QTableView header:

                          I'm not doing anything with the header except what I posted above. DeviceModel is my own class that has the actual Qt model as a member.

                          Indeed. My bad, sorry. It's rather odd. As far as I can tell this should be enough to have your header have a red background. As a follow up question: Do you use style sheets?

                          mzimmersM Offline
                          mzimmersM Offline
                          mzimmers
                          wrote on last edited by
                          #17

                          @kshegunov said in formatting a QTableView header:

                          As a follow up question: Do you use style sheets?

                          No, not in this app.

                          kshegunovK 1 Reply Last reply
                          0
                          • mzimmersM mzimmers

                            @kshegunov said in formatting a QTableView header:

                            As a follow up question: Do you use style sheets?

                            No, not in this app.

                            kshegunovK Offline
                            kshegunovK Offline
                            kshegunov
                            Moderators
                            wrote on last edited by kshegunov
                            #18

                            I just tested a project of mine, and it works correctly. Here's what I did:

                            #include <QBrush>
                            
                            QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
                            {
                                if (/*role != Qt::DisplayRole || */orientation != Qt::Horizontal || section > columnCount())
                                    return QVariant();
                            
                                if (role == Qt::DisplayRole)
                                    return columns.byIndex(section).displayName();
                                if (role == Qt::BackgroundRole)
                                    return QBrush(Qt::red);
                            
                                return QVariant();
                            }
                            

                            I observe the background of the table view's header to be red. It's really odd why it doesn't work for you. Can you retrieve the header data just after you've set it to the model to see if it's correctly stored? I.e.

                            m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, QBrush(Qt::red), Qt::BackgroundRole);
                            QBrush shouldBeRed = m_model->headerData(TAG_SERIALNUMBER, Qt::Horizontal, Qt::BackgroundRole);
                            

                            PS: The test was done with Qt 5.11.2 on Linux.

                            Read and abide by the Qt Code of Conduct

                            1 Reply Last reply
                            0
                            • mzimmersM Offline
                              mzimmersM Offline
                              mzimmers
                              wrote on last edited by
                              #19

                              How do I convert a QVariant to a QBrush?
                              0_1541262124374_wifiui.PNG

                              kshegunovK 1 Reply Last reply
                              0
                              • mzimmersM mzimmers

                                How do I convert a QVariant to a QBrush?
                                0_1541262124374_wifiui.PNG

                                kshegunovK Offline
                                kshegunovK Offline
                                kshegunov
                                Moderators
                                wrote on last edited by kshegunov
                                #20
                                QBrush brush = variant.value<QBrush>();
                                

                                However you can inspect the data directly in the variant as well, as far as I can see in the watch.

                                Read and abide by the Qt Code of Conduct

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

                                  @mzimmers: are you working on windows? https://bugreports.qt.io/browse/QTBUG-31804

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

                                  mzimmersM 1 Reply Last reply
                                  3
                                  • Christian EhrlicherC Christian Ehrlicher

                                    @mzimmers: are you working on windows? https://bugreports.qt.io/browse/QTBUG-31804

                                    mzimmersM Offline
                                    mzimmersM Offline
                                    mzimmers
                                    wrote on last edited by
                                    #22

                                    @Christian-Ehrlicher yes, I am, and that would seem to be the problem here. Plus, there's this:

                                    Widget::Widget(DeviceModel *d, QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
                                    {
                                    ...
                                        ui->tableView->horizontalHeader()->setBackgroundRole(QPalette::Window);
                                    

                                    So, do I need to create a QStyle for the underlining, and set that on my header view?

                                    kshegunovK 1 Reply Last reply
                                    0
                                    • mzimmersM mzimmers

                                      @Christian-Ehrlicher yes, I am, and that would seem to be the problem here. Plus, there's this:

                                      Widget::Widget(DeviceModel *d, QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
                                      {
                                      ...
                                          ui->tableView->horizontalHeader()->setBackgroundRole(QPalette::Window);
                                      

                                      So, do I need to create a QStyle for the underlining, and set that on my header view?

                                      kshegunovK Offline
                                      kshegunovK Offline
                                      kshegunov
                                      Moderators
                                      wrote on last edited by kshegunov
                                      #23

                                      @mzimmers said in formatting a QTableView header:

                                      So, do I need to create a QStyle for the underlining, and set that on my header view?

                                      I'd advise at least trying if that will fix the issue.

                                      Read and abide by the Qt Code of Conduct

                                      1 Reply Last reply
                                      0
                                      • mzimmersM Offline
                                        mzimmersM Offline
                                        mzimmers
                                        wrote on last edited by
                                        #24

                                        Do I need to derive a subclass from QStyle to do this?

                                        kshegunovK 1 Reply Last reply
                                        0
                                        • mzimmersM mzimmers

                                          Do I need to derive a subclass from QStyle to do this?

                                          kshegunovK Offline
                                          kshegunovK Offline
                                          kshegunov
                                          Moderators
                                          wrote on last edited by
                                          #25

                                          @mzimmers said in formatting a QTableView header:

                                          Do I need to derive a subclass from QStyle to do this?

                                          Yes. But maybe try QProxyStyle instead, so you have less work to do.

                                          Read and abide by the Qt Code of Conduct

                                          1 Reply Last reply
                                          0

                                          • Login

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