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