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 set a custom style into the QScrollBar of a QScrollArea?
Forum Updated to NodeBB v4.3 + New Features

How to set a custom style into the QScrollBar of a QScrollArea?

Scheduled Pinned Locked Moved Unsolved General and Desktop
20 Posts 4 Posters 1.7k Views 1 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.
  • CesarC Offline
    CesarC Offline
    Cesar
    wrote on last edited by Cesar
    #1

    I have created a custom QProxyStyle "ScrollBarStyle" and im setting it on the vertical scrollbar of a QScrollArea

    but the functions drawControl / drawComplexControl never get called, i also tried using QCommonStyle, same problem.

    What I'm missing?

    class ScrollBarStyle : public QProxyStyle
    {
    public:
       void drawControl(ControlElement element, const QStyleOption *option,
                                        QPainter *painter, const QWidget *widget) const override
       {
          qDebug() << "element: " << element;
    
          if (element == CE_ScrollBarSlider)
          {
             const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option);
             if (slider)
             {
             }
          }
          else
          {
             QProxyStyle::drawControl(element, option, painter, widget);
          }
       }
    
    
    
       void drawComplexControl(ComplexControl control, const QStyleOptionComplex* 
          option,  QPainter* painter, const QWidget* widget) const override
       {
          qDebug() << "control: " << control;
    
          if (control == CC_ScrollBar && option->state & State_Horizontal)
          {
             const QStyleOptionSlider* sliderOption = qstyleoption_cast<const QStyleOptionSlider*>(option);
             if (sliderOption)
             {
                   QRect handleRect = subControlRect(control, option, SC_ScrollBarSlider, widget);
                   painter->setBrush(Qt::red);
                   painter->drawRect(handleRect);
                   return;
             }
          }
    
          QProxyStyle::drawComplexControl(control, option, painter, widget);
    
       }
    };
    
    
    class ScrollArea : public QScrollArea
    {
        Q_OBJECT
    public:
    
        ScrollArea(QWidget* parent = 0) : QScrollArea(parent) 
        {
            //this->setStyle(new ScrollBarStyle);
            this->horizontalScrollBar()->setStyle(new ScrollBarStyle);
        }
    }
    JoeCFDJ C 2 Replies Last reply
    1
    • CesarC Cesar

      I have created a custom QProxyStyle "ScrollBarStyle" and im setting it on the vertical scrollbar of a QScrollArea

      but the functions drawControl / drawComplexControl never get called, i also tried using QCommonStyle, same problem.

      What I'm missing?

      class ScrollBarStyle : public QProxyStyle
      {
      public:
         void drawControl(ControlElement element, const QStyleOption *option,
                                          QPainter *painter, const QWidget *widget) const override
         {
            qDebug() << "element: " << element;
      
            if (element == CE_ScrollBarSlider)
            {
               const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option);
               if (slider)
               {
               }
            }
            else
            {
               QProxyStyle::drawControl(element, option, painter, widget);
            }
         }
      
      
      
         void drawComplexControl(ComplexControl control, const QStyleOptionComplex* 
            option,  QPainter* painter, const QWidget* widget) const override
         {
            qDebug() << "control: " << control;
      
            if (control == CC_ScrollBar && option->state & State_Horizontal)
            {
               const QStyleOptionSlider* sliderOption = qstyleoption_cast<const QStyleOptionSlider*>(option);
               if (sliderOption)
               {
                     QRect handleRect = subControlRect(control, option, SC_ScrollBarSlider, widget);
                     painter->setBrush(Qt::red);
                     painter->drawRect(handleRect);
                     return;
               }
            }
      
            QProxyStyle::drawComplexControl(control, option, painter, widget);
      
         }
      };
      
      
      class ScrollArea : public QScrollArea
      {
          Q_OBJECT
      public:
      
          ScrollArea(QWidget* parent = 0) : QScrollArea(parent) 
          {
              //this->setStyle(new ScrollBarStyle);
              this->horizontalScrollBar()->setStyle(new ScrollBarStyle);
          }
      }
      JoeCFDJ Offline
      JoeCFDJ Offline
      JoeCFD
      wrote on last edited by JoeCFD
      #2

      @Cesar said in How to set a custom style into the QScrollBar of a QScrollArea?:

      void drawControl(ControlElement element, const QStyleOption *option,
      QPainter *painter, const QWidget *widget) const

      I guess override is missing.

         void drawControl(ControlElement element, const QStyleOption *option,
                                          QPainter *painter, const QWidget *widget) const override
      {
      }
      
            void drawComplexControl(ComplexControl control, const QStyleOptionComplex* 
            option,  QPainter* painter, const QWidget* widget) const override
      {
      }
      
      CesarC 1 Reply Last reply
      0
      • JoeCFDJ JoeCFD

        @Cesar said in How to set a custom style into the QScrollBar of a QScrollArea?:

        void drawControl(ControlElement element, const QStyleOption *option,
        QPainter *painter, const QWidget *widget) const

        I guess override is missing.

           void drawControl(ControlElement element, const QStyleOption *option,
                                            QPainter *painter, const QWidget *widget) const override
        {
        }
        
              void drawComplexControl(ComplexControl control, const QStyleOptionComplex* 
              option,  QPainter* painter, const QWidget* widget) const override
        {
        }
        
        CesarC Offline
        CesarC Offline
        Cesar
        wrote on last edited by
        #3

        @JoeCFD I'm already overriding them, its because i copied the functions in the cpp directly into the post, ill edit the post.

        C 1 Reply Last reply
        0
        • CesarC Cesar

          @JoeCFD I'm already overriding them, its because i copied the functions in the cpp directly into the post, ill edit the post.

          C Offline
          C Offline
          CPPUIX
          wrote on last edited by
          #4

          @Cesar I tried to replicate this on my end, I have a QMainWindow, and adding a ScrollArea to it did not work as you said, drawControl() did not get called.

          But it did work when I set its Style in mainWindow.

          TQScrollArea *area = new TQScrollArea(this);
          
          area->setStyle(new ScrollBarStyle); //adding this line made it work
          

          Does this work for you?

          CesarC 1 Reply Last reply
          0
          • C CPPUIX

            @Cesar I tried to replicate this on my end, I have a QMainWindow, and adding a ScrollArea to it did not work as you said, drawControl() did not get called.

            But it did work when I set its Style in mainWindow.

            TQScrollArea *area = new TQScrollArea(this);
            
            area->setStyle(new ScrollBarStyle); //adding this line made it work
            

            Does this work for you?

            CesarC Offline
            CesarC Offline
            Cesar
            wrote on last edited by Cesar
            #5

            @Abderrahmene_Rayene said in How to set a custom style into the QScrollBar of a QScrollArea?:

            TQScrollArea *area = new TQScrollArea(this);

            area->setStyle(new ScrollBarStyle); //adding this line made it work

            I didnt understand, you applied the style in the QScrollArea? or in the QMainWIndow?

            C 1 Reply Last reply
            0
            • CesarC Cesar

              @Abderrahmene_Rayene said in How to set a custom style into the QScrollBar of a QScrollArea?:

              TQScrollArea *area = new TQScrollArea(this);

              area->setStyle(new ScrollBarStyle); //adding this line made it work

              I didnt understand, you applied the style in the QScrollArea? or in the QMainWIndow?

              C Offline
              C Offline
              CPPUIX
              wrote on last edited by
              #6

              @Cesar in QMainWindow

              CesarC 1 Reply Last reply
              0
              • C CPPUIX

                @Cesar in QMainWindow

                CesarC Offline
                CesarC Offline
                Cesar
                wrote on last edited by Cesar
                #7

                @Abderrahmene_Rayene even adding it to the QMainWindow it isnt getting called, adding it as qApp->setStyle() only drawControl get called, but never CE_ScrollBarSlider

                In this similar question someone mentioned to do exactly what i tried, reimplementing the drawComplexControl.

                And in this question he mentioned about needing to reset Qt::WA_OpaquePaintEvent to get the style working, but i didn't understand what he mean which "reset".

                C 2 Replies Last reply
                0
                • CesarC Cesar

                  @Abderrahmene_Rayene even adding it to the QMainWindow it isnt getting called, adding it as qApp->setStyle() only drawControl get called, but never CE_ScrollBarSlider

                  In this similar question someone mentioned to do exactly what i tried, reimplementing the drawComplexControl.

                  And in this question he mentioned about needing to reset Qt::WA_OpaquePaintEvent to get the style working, but i didn't understand what he mean which "reset".

                  C Offline
                  C Offline
                  CPPUIX
                  wrote on last edited by
                  #8

                  @Cesar this solution does not fix your problem. I think he meant setting its attribute to false

                  area->verticalScrollBar()->setAttribute(Qt::WA_OpaquePaintEvent,false);
                  

                  And sorry I didn't realize that I set the style of the scrollArea not the scrollBar, and it doesn't work yeah.

                  1 Reply Last reply
                  0
                  • CesarC Cesar

                    @Abderrahmene_Rayene even adding it to the QMainWindow it isnt getting called, adding it as qApp->setStyle() only drawControl get called, but never CE_ScrollBarSlider

                    In this similar question someone mentioned to do exactly what i tried, reimplementing the drawComplexControl.

                    And in this question he mentioned about needing to reset Qt::WA_OpaquePaintEvent to get the style working, but i didn't understand what he mean which "reset".

                    C Offline
                    C Offline
                    CPPUIX
                    wrote on last edited by
                    #9

                    @Cesar I had an idea, what if the reason it's not getting called is because there is no scrollBar to draw, so I added this line in QMainWindow:

                    area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
                    

                    and it worked, both functions got called, drawControl / drawComplexControl

                    CesarC 1 Reply Last reply
                    0
                    • C CPPUIX

                      @Cesar I had an idea, what if the reason it's not getting called is because there is no scrollBar to draw, so I added this line in QMainWindow:

                      area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
                      

                      and it worked, both functions got called, drawControl / drawComplexControl

                      CesarC Offline
                      CesarC Offline
                      Cesar
                      wrote on last edited by
                      #10

                      @Abderrahmene_Rayene i already had the flag ScrollBarAlwaysOn set on, and im testing with a QScrollArea that the QScrollBar is visible.

                      At my side its still not getting called, even applying the style on the QMainWindow / QScrollArea QScrollBar

                      C 1 Reply Last reply
                      0
                      • CesarC Cesar

                        @Abderrahmene_Rayene i already had the flag ScrollBarAlwaysOn set on, and im testing with a QScrollArea that the QScrollBar is visible.

                        At my side its still not getting called, even applying the style on the QMainWindow / QScrollArea QScrollBar

                        C Offline
                        C Offline
                        CPPUIX
                        wrote on last edited by CPPUIX
                        #11

                        @Cesar Then there's something else you should mention, because it does call drawComplex on my end, after I replicated what you posted, and the ScrollBar is drawn red and without arrows.

                        This is how it looks like:

                        scrollbar.png

                        JonBJ CesarC 3 Replies Last reply
                        0
                        • C CPPUIX

                          @Cesar Then there's something else you should mention, because it does call drawComplex on my end, after I replicated what you posted, and the ScrollBar is drawn red and without arrows.

                          This is how it looks like:

                          scrollbar.png

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by JonB
                          #12

                          @Abderrahmene_Rayene
                          You don't put a debug inside the if (sliderOption) to tell us, but are you saying that

                          const QStyleOptionSlider* sliderOption = qstyleoption_cast<const QStyleOptionSlider*>(option);
                          

                          is returning nullptr/so false for the if? You never get to fprintf(stderr,"innercomplex\n");?

                          C 1 Reply Last reply
                          0
                          • JonBJ JonB

                            @Abderrahmene_Rayene
                            You don't put a debug inside the if (sliderOption) to tell us, but are you saying that

                            const QStyleOptionSlider* sliderOption = qstyleoption_cast<const QStyleOptionSlider*>(option);
                            

                            is returning nullptr/so false for the if? You never get to fprintf(stderr,"innercomplex\n");?

                            C Offline
                            C Offline
                            CPPUIX
                            wrote on last edited by
                            #13

                            @JonB I have edited my reply, see if you can correct what's wrong or provide a clarification.

                            1 Reply Last reply
                            0
                            • C CPPUIX

                              @Cesar Then there's something else you should mention, because it does call drawComplex on my end, after I replicated what you posted, and the ScrollBar is drawn red and without arrows.

                              This is how it looks like:

                              scrollbar.png

                              JonBJ Offline
                              JonBJ Offline
                              JonB
                              wrote on last edited by JonB
                              #14

                              @Abderrahmene_Rayene said in How to set a custom style into the QScrollBar of a QScrollArea?:

                              if (control == CC_ScrollBar && option->state & State_Horizontal)

                              Where do you (or the OP) get option->state & State_Horizontal from? I see Qt::Orientation QStyleOptionSlider::orientation? Do not assume QStyle::State_Horizontal is what you need for a QScrollbar....

                              C 1 Reply Last reply
                              0
                              • JonBJ JonB

                                @Abderrahmene_Rayene said in How to set a custom style into the QScrollBar of a QScrollArea?:

                                if (control == CC_ScrollBar && option->state & State_Horizontal)

                                Where do you (or the OP) get option->state & State_Horizontal from? I see Qt::Orientation QStyleOptionSlider::orientation? Do not assume QStyle::State_Horizontal is what you need for a QScrollbar....

                                C Offline
                                C Offline
                                CPPUIX
                                wrote on last edited by CPPUIX
                                #15

                                @JonB OP is using this function:

                                [override virtual] void QProxyStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const
                                

                                which should get called to draw the scrollBar.

                                As for State_Horizontal, it didn't work for me because I was setting the style for the vertical scroll bar, my bad. It works fine with the horizontal scroll bar. So why shouldn't one use it for QScrollBar.

                                Sorry for the over-editing, I'm replying and testing simultaneously, I have included an image to display the outcome, it works fine, I can't replicate OP's problem.

                                JonBJ 1 Reply Last reply
                                0
                                • C CPPUIX

                                  @Cesar Then there's something else you should mention, because it does call drawComplex on my end, after I replicated what you posted, and the ScrollBar is drawn red and without arrows.

                                  This is how it looks like:

                                  scrollbar.png

                                  CesarC Offline
                                  CesarC Offline
                                  Cesar
                                  wrote on last edited by
                                  #16

                                  @Abderrahmene_Rayene im not sure if i understood what you did, could you post a reproducible example of the code you're using?

                                  C 1 Reply Last reply
                                  0
                                  • CesarC Cesar

                                    @Abderrahmene_Rayene im not sure if i understood what you did, could you post a reproducible example of the code you're using?

                                    C Offline
                                    C Offline
                                    CPPUIX
                                    wrote on last edited by CPPUIX
                                    #17

                                    @Cesar I had TQScrollArea and ScrollBarStyle in a separate header file, but I included them in the mainwindow header so that I don't post 3 files contents.

                                    mainwindow.cpp:

                                    #include "mainwindow.h"
                                    #include "./ui_mainwindow.h"
                                    
                                    MainWindow::MainWindow(QWidget *parent)
                                        : QMainWindow(parent)
                                        , ui(new Ui::MainWindow)
                                    {
                                        ui->setupUi(this);
                                    
                                    
                                        TQScrollArea *area = new TQScrollArea(this);
                                        QWidget *widget = new QWidget();
                                        widget->setGeometry(0,0,700,400);
                                        area->setWidget(widget);
                                        area->horizontalScrollBar()->setStyle(new ScrollBarStyle);
                                        area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
                                        area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
                                    
                                        area->setGeometry(0,0,500,300);
                                    }
                                    
                                    MainWindow::~MainWindow()
                                    {
                                        delete ui;
                                    }
                                    

                                    mainwindow.h:

                                    #ifndef MAINWINDOW_H
                                    #define MAINWINDOW_H
                                    
                                    #include <QMainWindow>
                                    #include <QWidget>
                                    #include <QScrollArea>
                                    #include <QObject>
                                    #include <QWidget>
                                    #include <QScrollBar>
                                    #include <QDebug>
                                    #include <QStyleOptionSlider>
                                    #include <QPainter>
                                    #include <QProxyStyle>
                                    
                                    class ScrollBarStyle : public QProxyStyle
                                    {
                                    public:
                                    
                                    
                                        void drawControl(ControlElement element, const QStyleOption *option,
                                                         QPainter *painter, const QWidget *widget) const override
                                        {
                                    
                                            fprintf(stderr,"before\n");
                                            if (element == CE_ScrollBarSlider)
                                            {
                                                fprintf(stderr,"after\n");
                                                const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option);
                                                if (slider)
                                                {
                                                }
                                            }
                                            else
                                            {
                                                QProxyStyle::drawControl(element, option, painter, widget);
                                            }
                                        }
                                    
                                        void drawComplexControl(ComplexControl control, const QStyleOptionComplex*
                                                                                            option,  QPainter* painter, const QWidget* widget) const override
                                        {
                                            fprintf(stderr,"beforecomplex\n");
                                    
                                            if (control == CC_ScrollBar && option->state & State_Horizontal)
                                            {
                                                fprintf(stderr,"aftercomplex\n");
                                                const QStyleOptionSlider* sliderOption = qstyleoption_cast<const QStyleOptionSlider*>(option);
                                                if (sliderOption)
                                                {
                                                    fprintf(stderr,"innercomplex\n");
                                                    QRect handleRect = subControlRect(control, option, SC_ScrollBarSlider, widget);
                                                    painter->setBrush(Qt::red);
                                                    painter->drawRect(handleRect);
                                                    return;
                                                }
                                            }
                                    
                                            QProxyStyle::drawComplexControl(control, option, painter, widget);
                                    
                                        }
                                    };
                                    
                                    class TQScrollArea : public QScrollArea
                                    {
                                        Q_OBJECT
                                    public:
                                    
                                        TQScrollArea(QWidget* parent = 0) : QScrollArea(parent)
                                        {
                                            this->verticalScrollBar()->setStyle(new ScrollBarStyle);
                                        }
                                    };
                                    
                                    QT_BEGIN_NAMESPACE
                                    namespace Ui { class MainWindow; }
                                    QT_END_NAMESPACE
                                    
                                    class MainWindow : public QMainWindow
                                    {
                                        Q_OBJECT
                                    
                                    public:
                                        MainWindow(QWidget *parent = nullptr);
                                        ~MainWindow();
                                    
                                    private:
                                        Ui::MainWindow *ui;
                                    
                                    };
                                    #endif // MAINWINDOW_H
                                    

                                    mainc.cpp is just the regular autogenerated one, didn't touch it.

                                    1 Reply Last reply
                                    0
                                    • C CPPUIX

                                      @JonB OP is using this function:

                                      [override virtual] void QProxyStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const
                                      

                                      which should get called to draw the scrollBar.

                                      As for State_Horizontal, it didn't work for me because I was setting the style for the vertical scroll bar, my bad. It works fine with the horizontal scroll bar. So why shouldn't one use it for QScrollBar.

                                      Sorry for the over-editing, I'm replying and testing simultaneously, I have included an image to display the outcome, it works fine, I can't replicate OP's problem.

                                      JonBJ Offline
                                      JonBJ Offline
                                      JonB
                                      wrote on last edited by
                                      #18

                                      @Abderrahmene_Rayene said in How to set a custom style into the QScrollBar of a QScrollArea?:

                                      As for State_Horizontal, it didn't work for me because I was setting the style for the vertical scroll bar, my bad. It works fine with the horizontal scroll bar. So why shouldn't one use it for QScrollBar.

                                      At the time you were saying the condition was not being entered. I didn't say option->state & State_Horizontal would not work, I said to check assumption, since there isa specific QStyleOptionSlider::orientation == Qt::Horizontal for a slider style option.

                                      C 1 Reply Last reply
                                      0
                                      • JonBJ JonB

                                        @Abderrahmene_Rayene said in How to set a custom style into the QScrollBar of a QScrollArea?:

                                        As for State_Horizontal, it didn't work for me because I was setting the style for the vertical scroll bar, my bad. It works fine with the horizontal scroll bar. So why shouldn't one use it for QScrollBar.

                                        At the time you were saying the condition was not being entered. I didn't say option->state & State_Horizontal would not work, I said to check assumption, since there isa specific QStyleOptionSlider::orientation == Qt::Horizontal for a slider style option.

                                        C Offline
                                        C Offline
                                        CPPUIX
                                        wrote on last edited by
                                        #19

                                        @JonB thanks, that's a useful tip.

                                        1 Reply Last reply
                                        0
                                        • CesarC Cesar

                                          I have created a custom QProxyStyle "ScrollBarStyle" and im setting it on the vertical scrollbar of a QScrollArea

                                          but the functions drawControl / drawComplexControl never get called, i also tried using QCommonStyle, same problem.

                                          What I'm missing?

                                          class ScrollBarStyle : public QProxyStyle
                                          {
                                          public:
                                             void drawControl(ControlElement element, const QStyleOption *option,
                                                                              QPainter *painter, const QWidget *widget) const override
                                             {
                                                qDebug() << "element: " << element;
                                          
                                                if (element == CE_ScrollBarSlider)
                                                {
                                                   const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option);
                                                   if (slider)
                                                   {
                                                   }
                                                }
                                                else
                                                {
                                                   QProxyStyle::drawControl(element, option, painter, widget);
                                                }
                                             }
                                          
                                          
                                          
                                             void drawComplexControl(ComplexControl control, const QStyleOptionComplex* 
                                                option,  QPainter* painter, const QWidget* widget) const override
                                             {
                                                qDebug() << "control: " << control;
                                          
                                                if (control == CC_ScrollBar && option->state & State_Horizontal)
                                                {
                                                   const QStyleOptionSlider* sliderOption = qstyleoption_cast<const QStyleOptionSlider*>(option);
                                                   if (sliderOption)
                                                   {
                                                         QRect handleRect = subControlRect(control, option, SC_ScrollBarSlider, widget);
                                                         painter->setBrush(Qt::red);
                                                         painter->drawRect(handleRect);
                                                         return;
                                                   }
                                                }
                                          
                                                QProxyStyle::drawComplexControl(control, option, painter, widget);
                                          
                                             }
                                          };
                                          
                                          
                                          class ScrollArea : public QScrollArea
                                          {
                                              Q_OBJECT
                                          public:
                                          
                                              ScrollArea(QWidget* parent = 0) : QScrollArea(parent) 
                                              {
                                                  //this->setStyle(new ScrollBarStyle);
                                                  this->horizontalScrollBar()->setStyle(new ScrollBarStyle);
                                              }
                                          }
                                          C Offline
                                          C Offline
                                          CPPUIX
                                          wrote on last edited by
                                          #20

                                          @Cesar Btw you said you're setting style for the vertical scroll bar, but your code is handling horizontal bar style.

                                          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