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 do I subclass QDial to show notches values ?
Qt 6.11 is out! See what's new in the release blog

How do I subclass QDial to show notches values ?

Scheduled Pinned Locked Moved Solved General and Desktop
39 Posts 2 Posters 27.3k 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.
  • mrjjM mrjj

    but since you already subclassed it, why not make it work 100% like u want?
    Also need to be able to give list for the "tick words" etc.
    So find the source and see the paitnevent
    maybe its easy to modify for what u want.

    PuntP Offline
    PuntP Offline
    Punt
    wrote on last edited by
    #23

    @mrjj said:

    but since you already subclassed it, why not make it work 100% like u want?
    Also need to be able to give list for the "tick words" etc.
    So find the source and see the paitnevent
    maybe its easy to modify for what u want.

    If I create a composite class, I don't need anymore my subclass...
    Well I don't know, I'll check tomorrow if it's easy (Because i'll probably have to change another thing on a QDial => but that's another thing x) )

    I guess i'll update this topic tomorrow, so if someone has another idea, I take it :)

    Edit for your last message : I'll check tomorrow, I go home and I can't work there :p

    See you

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

      before u try composite, please try adjust paint first.
      So little code.

      1 Reply Last reply
      0
      • mrjjM mrjj

        void QDial::paintEvent(QPaintEvent *)
        {
        QStylePainter p(this);
        QStyleOptionSlider option;
        initStyleOption(&option);
        p.drawComplexControl(QStyle::CC_Dial, option);
        }

        So u can just change option.rect ( check name)
        and you can control the size of the dial.

        PuntP Offline
        PuntP Offline
        Punt
        wrote on last edited by
        #25

        @mrjj said:

        void QDial::paintEvent(QPaintEvent *)
        {
        QStylePainter p(this);
        QStyleOptionSlider option;
        initStyleOption(&option);
        p.drawComplexControl(QStyle::CC_Dial, option);
        }

        So u can just change option.rect ( check name)
        and you can control the size of the dial.

        I can't do "option.something" ...

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

          why not?
          Look in help then?

          http://doc.qt.io/qt-5/qstyleoption.html#rect-var

          PuntP 1 Reply Last reply
          0
          • mrjjM mrjj

            why not?
            Look in help then?

            http://doc.qt.io/qt-5/qstyleoption.html#rect-var

            PuntP Offline
            PuntP Offline
            Punt
            wrote on last edited by Punt
            #27

            @mrjj
            Now the problem is I can extend the area and write text in the right and in the bottom of the QDial (because the QDial is drawn (good english ?!) in the left-top (0,0) ). And I don't have any idea how to change that.. I searched if there is something like the position where qt draw of something like that, but didn't find it .. --'

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

              hi
              Not tested myself.
              option.rect should control where QDial is
              and the normal rect is your widget.

              So if u set option.rect before
              p.drawComplex

              U should be able to move it around?

              PuntP 1 Reply Last reply
              0
              • mrjjM mrjj

                hi
                Not tested myself.
                option.rect should control where QDial is
                and the normal rect is your widget.

                So if u set option.rect before
                p.drawComplex

                U should be able to move it around?

                PuntP Offline
                PuntP Offline
                Punt
                wrote on last edited by
                #29

                @mrjj
                Look, if I

                option.rect.setX(20)
                

                this is just moving one part of the QDial --'
                Gyazo

                And what do you mean about the normal rect ?

                The only rect I have is option.rect no ?!

                mrjjM 1 Reply Last reply
                0
                • PuntP Punt

                  @mrjj
                  Look, if I

                  option.rect.setX(20)
                  

                  this is just moving one part of the QDial --'
                  Gyazo

                  And what do you mean about the normal rect ?

                  The only rect I have is option.rect no ?!

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

                  @Punt
                  Option has rect yes, used for the drawComplexControl call.
                  You own widget, also has rect, simply called rect or this->rect
                  which is the real area since the QDial is just painted.

                  PuntP 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    @Punt
                    Option has rect yes, used for the drawComplexControl call.
                    You own widget, also has rect, simply called rect or this->rect
                    which is the real area since the QDial is just painted.

                    PuntP Offline
                    PuntP Offline
                    Punt
                    wrote on last edited by
                    #31

                    @mrjj

                        rect().setRect(0,0,200,200);
                        option.rect.setRect(30,30,100,100);
                        p.drawText(120,120,"(120,120)");
                        p.drawText(30,30,"(30,30)");
                        p.drawText(200,200,"(200,200)");
                    

                    => Gyazo

                    I don't find anything to move ticks ...

                    mrjjM 1 Reply Last reply
                    0
                    • PuntP Punt

                      @mrjj

                          rect().setRect(0,0,200,200);
                          option.rect.setRect(30,30,100,100);
                          p.drawText(120,120,"(120,120)");
                          p.drawText(30,30,"(30,30)");
                          p.drawText(200,200,"(200,200)");
                      

                      => Gyazo

                      I don't find anything to move ticks ...

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

                      Hmm
                      so it dont use option.rect() for the tick drawing.
                      Strange.

                      Alternatively
                      new a layout
                      set to your widget
                      New a QDial
                      add to layout
                      adjust layout margins to get room for text.
                      Paint the text in paintEvent.
                      Remove the drawComplexControl etc.

                      PuntP 1 Reply Last reply
                      0
                      • mrjjM mrjj

                        Hmm
                        so it dont use option.rect() for the tick drawing.
                        Strange.

                        Alternatively
                        new a layout
                        set to your widget
                        New a QDial
                        add to layout
                        adjust layout margins to get room for text.
                        Paint the text in paintEvent.
                        Remove the drawComplexControl etc.

                        PuntP Offline
                        PuntP Offline
                        Punt
                        wrote on last edited by
                        #33

                        @mrjj
                        In my subclass ?

                        mrjjM 1 Reply Last reply
                        0
                        • PuntP Punt

                          @mrjj
                          In my subclass ?

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

                          @Punt
                          Yes
                          In constructor
                          so it becomes a composite widget with a normal QDial inside.
                          You will also have to create some public signal to use from outside
                          since you cannot directly connect to the QDail.

                          mrjjM 1 Reply Last reply
                          0
                          • mrjjM mrjj

                            @Punt
                            Yes
                            In constructor
                            so it becomes a composite widget with a normal QDial inside.
                            You will also have to create some public signal to use from outside
                            since you cannot directly connect to the QDail.

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

                            Hi
                            yes that seems to be possible.

                            https://www.dropbox.com/s/5hjry2pcb0mpsi2/myqdial.zip?dl=0
                            I just did it in Creator for test. Using code in
                            CustomDial is smarter.

                            PuntP 1 Reply Last reply
                            0
                            • mrjjM mrjj

                              Hi
                              yes that seems to be possible.

                              https://www.dropbox.com/s/5hjry2pcb0mpsi2/myqdial.zip?dl=0
                              I just did it in Creator for test. Using code in
                              CustomDial is smarter.

                              PuntP Offline
                              PuntP Offline
                              Punt
                              wrote on last edited by
                              #36

                              @mrjj

                              Sorry was busy...
                              I don't understand how to do it..
                              I tried, when I want to use layout() this is crashing.. I tried different things but isn't working, I'm tired of this button x)

                              mrjjM 1 Reply Last reply
                              0
                              • PuntP Punt

                                @mrjj

                                Sorry was busy...
                                I don't understand how to do it..
                                I tried, when I want to use layout() this is crashing.. I tried different things but isn't working, I'm tired of this button x)

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

                                @Punt
                                Np.
                                Did u try test?
                                U must create layout first with new
                                and assign to ur widget
                                else
                                layout() returns null.
                                something like
                                QVBoxLayou *verticalLayout = new QVBoxLayout(this);
                                verticalLayout->setContentsMargins(32, 32, 32, 32);
                                QDial *dial = new QDial(this); ** might have this as class memeber
                                verticalLayout->addWidget(dial);

                                PuntP 1 Reply Last reply
                                0
                                • mrjjM mrjj

                                  @Punt
                                  Np.
                                  Did u try test?
                                  U must create layout first with new
                                  and assign to ur widget
                                  else
                                  layout() returns null.
                                  something like
                                  QVBoxLayou *verticalLayout = new QVBoxLayout(this);
                                  verticalLayout->setContentsMargins(32, 32, 32, 32);
                                  QDial *dial = new QDial(this); ** might have this as class memeber
                                  verticalLayout->addWidget(dial);

                                  PuntP Offline
                                  PuntP Offline
                                  Punt
                                  wrote on last edited by Punt
                                  #38

                                  @mrjj said:

                                  @Punt
                                  Np.
                                  Did u try test?
                                  U must create layout first with new
                                  and assign to ur widget
                                  else
                                  layout() returns null.
                                  something like
                                  QVBoxLayou *verticalLayout = new QVBoxLayout(this);
                                  verticalLayout->setContentsMargins(32, 32, 32, 32);
                                  QDial *dial = new QDial(this); ** might have this as class memeber
                                  verticalLayout->addWidget(dial);

                                  Ok that worked, thanks bro ! now I'll add my texts where I want :)

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

                                    super!
                                    You might need to surface some of the signals from the QDial to make
                                    it do anything usefull.

                                    In this regards , please note that u -can- connect signals to signals
                                    So you can define some new public signals and hook the new signals
                                    to the QDial signals.
                                    From outside u can then connect to the new signals.

                                    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