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 31.2k 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 Offline
    mzimmersM Offline
    mzimmers
    wrote on last edited by
    #27

    OK, I have a little spare time now. I've copied this code (from the page):

    class MyProxyStyle : public QProxyStyle
    {
      public:
        int styleHint(StyleHint hint, const QStyleOption *option = 0,
                      const QWidget *widget = 0, QStyleHintReturn *returnData = 0) const override
        {
            if (hint == QStyle::SH_UnderlineShortcut)
                return 0;
            return QProxyStyle::styleHint(hint, option, widget, returnData);
        }
    };
    

    What would you suggest I use instead of SH_UnderlineShortcut to test whether my styling is taking effect? (Given the trouble we were having earlier.)

    Thanks.

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #28

      Hi,

      How did you set your custom style ?

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

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

        Hi SGaist - like this:

            MyProxyStyle *mps = new MyProxyStyle;
            ui->tableView->setStyle(mps);
        
        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #30

          What if you set it application wide ?

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

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

            I can try that. What I was asking for, though, was a style hint that would be readily apparent in my app. The one in the example might work perfectly, but I'd never see it without implementing any shortcuts (at least I think not).

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

              For what it's worth, this line of code produces expected results:

              ui->tableView->setStyleSheet("background-color: red");
              

              But this one does not:

                  ui->tableView->horizontalHeader()->setStyleSheet("background-color: red");
              

              So the problem seems to be in the header object, doesn't it?

              1 Reply Last reply
              0
              • mzimmersM mzimmers

                I can try that. What I was asking for, though, was a style hint that would be readily apparent in my app. The one in the example might work perfectly, but I'd never see it without implementing any shortcuts (at least I think not).

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

                You don't need a style hint if you're trying to override the painting. You'd have to reimplement QStyle::drawControl and handle the QStyle::CE_Header control. Something like this:

                class MyProxyStyle : public QProxyStyle
                {
                public:
                    void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const override
                    {
                        if (element != QStyle::CE_Header)  {
                             baseStyle()->drawControl(element, option, painter, widget);
                             return;
                        }
                
                        // Paint here ...
                    }
                };
                

                It's been a long time since I last played with the styles, but I hope this is of help.

                Read and abide by the Qt Code of Conduct

                1 Reply Last reply
                1
                • VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on last edited by VRonin
                  #34

                  You might want to try just adding QApplication::setStyle(QStyleFactory::create("Fusion")); to your main(). The fusion style supports the styling of QHeaderViews even on windows

                  "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

                  mzimmersM 1 Reply Last reply
                  3
                  • VRoninV VRonin

                    You might want to try just adding QApplication::setStyle(QStyleFactory::create("Fusion")); to your main(). The fusion style supports the styling of QHeaderViews even on windows

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

                    @VRonin using that style, along with the style sheet, did in fact paint my header background red. Thank you!

                    Now, for creating a separation line under the header...is it recommended that I try to use a style sheet, or QStyles?

                    1 Reply Last reply
                    0
                    • VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by
                      #36

                      Try the fast way, use stylesheet

                      "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

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

                        Interesting results...I tried this:

                            ui->tableView->horizontalHeader()->setStyleSheet("border-bottom: 5px solid red");
                        

                        And got this:
                        0_1541699574292_header.PNG

                        I must be malforming the stylesheet (I pulled the contents directly from a CSS example I found online), but the curious (to me) part is I'm now getting an underline (actually a bottom border, I guess) across the entire header, but only the middle column is painted red (which I don't understand either).

                        Thoughts?

                        1 Reply Last reply
                        0
                        • VRoninV Offline
                          VRoninV Offline
                          VRonin
                          wrote on last edited by VRonin
                          #38

                          http://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview

                          "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

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

                            Disregard my image above: the setting of the red background was due to a separate experiment I'd been performing on the model. It was disguised when I set the entire header view to red, then reappeared when I removed that CSS in favor of the bottom border.

                            I'd actually read that page you referenced, but I don't fully understand the syntax. I can see that everything in the braces is Qt style information, but what is the context in which they're used? For example, in this:

                            QHeaderView::section
                            

                            What is "section?"

                            1 Reply Last reply
                            0
                            • VRoninV Offline
                              VRoninV Offline
                              VRonin
                              wrote on last edited by
                              #40

                              it's the sub element inside the headerview. That style applies to every single row/column header cell

                              "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

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

                                Ah, I see (I think). Well, the upshot is that I can remove all of my stylesheet settings. The use of the Fusion style gave me the desired look:

                                0_1541779015718_wifiui.PNG

                                Which is fortunate, because this attempt at stylesheet setting didn't work:

                                    ui->tableView->horizontalHeader()->setStyleSheet("border-bottom: 5px solid red");
                                

                                Not sure why (the red background worked).

                                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