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. Hover ToolButton GIF Not Moving
Forum Updated to NodeBB v4.3 + New Features

Hover ToolButton GIF Not Moving

Scheduled Pinned Locked Moved General and Desktop
15 Posts 2 Posters 5.2k 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.
  • W Offline
    W Offline
    wallacesoh
    wrote on last edited by
    #1

    I have a toolbutton and when I hover over the toolbutton, the GIF is shown but the GIF is not moving (it is an animated GIF).

    @animatedButton->setStyleSheet("ToolButton:hover { background-image: url(../GIF/animated-picture.gif); }");@

    Can anyone please advise?

    1 Reply Last reply
    0
    • raven-worxR Offline
      raven-worxR Offline
      raven-worx
      Moderators
      wrote on last edited by
      #2

      that's unfortunately not working that easy out of the box yet.
      You would need to set the GIF to a QMovie. And connect to it's frameChanged() signal and in the slot use QMoview::currentPixmap() and set it on your tool button each time.

      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
      If you have a question please use the forum so others can benefit from the solution in the future

      1 Reply Last reply
      0
      • W Offline
        W Offline
        wallacesoh
        wrote on last edited by
        #3

        That seems like a lot of work. I tried to do up the following but it is not working. I'm not sure if I have done it right.

        @QMovie *pixMap = new QMovie;
        pixMap->setFileName("../GIF/animated-picture.gif");
        animatedButton->setIcon(pixMap));
        connect(pixMap, SIGNAL(frameChanged()), pixMap, SLOT(QMovie::currentPixmap()));@

        1 Reply Last reply
        0
        • raven-worxR Offline
          raven-worxR Offline
          raven-worx
          Moderators
          wrote on last edited by
          #4

          no you misunderstood me.
          I was talking about something like this:
          @
          QMovie *movie = new QMovie;
          movie->setFileName("../GIF/animated-picture.gif");
          animatedButton->setIcon(movie->currentPixmap());
          connect(movie, SIGNAL(frameChanged()), this, SLOT(onFrameChanged()));

          ...

          //SLOT
          void onFrameChanged()
          {
          animatedButton->setIcon( movie->currentPixmap() );
          }
          @

          --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
          If you have a question please use the forum so others can benefit from the solution in the future

          1 Reply Last reply
          0
          • W Offline
            W Offline
            wallacesoh
            wrote on last edited by
            #5

            Thanks raven-worx. I tried your codes and there is no display on the tool button. May I know why do we need to declare twice of the following?

            @animatedButton->setIcon(movie->currentPixmap());@

            1 Reply Last reply
            0
            • raven-worxR Offline
              raven-worxR Offline
              raven-worx
              Moderators
              wrote on last edited by
              #6

              sorry... i forgot to call start() on the QMovie.

              [quote author="wallacesoh" date="1381395886"]May I know why do we need to declare twice of the following?

              @animatedButton->setIcon(movie->currentPixmap());@[/quote]

              you actually don't need it, i just did it to have an initial icon set on the tool button. But once the QMovie emits frameChanged() signal a icon will be set anyway.

              [quote author="wallacesoh" date="1381395886"]I tried your codes and there is no display on the tool button.[/quote]

              Please make sure that the path to file is valid.
              e.g. use QFile::exists(...) for a quick check.

              --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
              If you have a question please use the forum so others can benefit from the solution in the future

              1 Reply Last reply
              0
              • W Offline
                W Offline
                wallacesoh
                wrote on last edited by
                #7

                When I called start() on the QMovie, the GIF appears. However it's not moving. It's a working GIF.

                1 Reply Last reply
                0
                • raven-worxR Offline
                  raven-worxR Offline
                  raven-worx
                  Moderators
                  wrote on last edited by
                  #8

                  hmm... what does QMovie::isValid() return?

                  --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                  If you have a question please use the forum so others can benefit from the solution in the future

                  1 Reply Last reply
                  0
                  • W Offline
                    W Offline
                    wallacesoh
                    wrote on last edited by
                    #9

                    It is valid. The slot, onFrameChanged() is probably not being called.

                    1 Reply Last reply
                    0
                    • raven-worxR Offline
                      raven-worxR Offline
                      raven-worx
                      Moderators
                      wrote on last edited by
                      #10

                      [quote author="wallacesoh" date="1381399626"]It is valid. The slot, onFrameChanged() is probably not being called. [/quote]

                      -what does the connect statement return? If false whats the output in the console?-

                      damn it ... signal signature was wrong:
                      @
                      connect(movie, SIGNAL(frameChanged(int)), this, SLOT(onFrameChanged()));
                      @

                      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                      If you have a question please use the forum so others can benefit from the solution in the future

                      1 Reply Last reply
                      0
                      • W Offline
                        W Offline
                        wallacesoh
                        wrote on last edited by
                        #11

                        Great! Thanks raven-worx. :) It worked! I guess the missing int is the reason why the SLOT is not being called.

                        1 Reply Last reply
                        0
                        • W Offline
                          W Offline
                          wallacesoh
                          wrote on last edited by
                          #12

                          Sorry. I would like to ask another question. If I were to hover the tool button and display this GIF. Would it be the same?

                          My current codes are:
                          @animatedButton->setStyleSheet("QToolButton:hover { background-image: url(../GIF/animated-picture.gif"); }");@

                          But it won't animate. Is there a way to connect the signal and slot to setStyleSheet?

                          1 Reply Last reply
                          0
                          • W Offline
                            W Offline
                            wallacesoh
                            wrote on last edited by
                            #13

                            I have tried mouse events:

                            @movie->setFileName("../GIF/animated-picture.gif");
                            movie->start();
                            animatedButton->setIcon(movie->currentPixmap());
                            connect(movie, SIGNAL(frameChanged(int)), this, SLOT(onFrameChanged()));

                            void ToolBarPalettes::enterEvent(QEvent *event)
                            {
                            animatedButton->setIcon(movie->currentPixmap());
                            }

                            void ToolBarPalettes::leaveEvent(QEvent *event)
                            {
                            animatedButton->setIcon(QPixmap("../IMG/still-picture.png"));
                            }@

                            I understand that onFrameChanged() is not called. Therefore, the animation doesn't works. Is it possible to change the connect statement to cater to mouse enter events?

                            1 Reply Last reply
                            0
                            • raven-worxR Offline
                              raven-worxR Offline
                              raven-worx
                              Moderators
                              wrote on last edited by
                              #14

                              define your custom ToolButton class like this:
                              @
                              class MyAnimatedToolButton : public QToolButton
                              {
                              Q_OBJECT
                              Q_PROPERT(QString animatedIconPath READ animatedIconPath WRITE setAnimatedIconPath DESIGNABLE true )

                              public:
                              MyAnimatedToolButton(QWidget* parent = 0) : QToolButton(parent)
                              {
                              connect(&movie, SIGNAL(frameChanged()), this, SLOT(onFrameChanged()));
                              }

                               QString animatedIconPath() const
                               {
                                    return movie.filePath();
                               }
                              
                               void setAniamtedIconPath(const QString & path)
                               {
                                     movie.setFilePath(path);
                                     if( path.isEmpty() )
                                          movie.stop();
                                     else
                                           movie.start();
                               }
                              

                              protected slots:
                              void onFrameChanged()
                              {
                              this->setIcon( movie.currentPixmap() );
                              }

                              protected:
                              QMovie movie;
                              }
                              @

                              Then you can do this in your stylesheet:
                              @
                              MyAnimatedToolButton
                              {
                              qproperty-animatedIconPath: "../GIF/animated-picture.gif";
                              }

                              MyAnimatedToolButton:hover
                              {
                              qproperty-animatedIconPath: "";
                              qproperty-icon: url(../IMG/stillpicture.png");
                              }
                              @

                              This should give you an idea.

                              Or go with the event handler approach like you tried. But then take care of stopping the QMovie at the appropriate point:
                              @
                              void ToolBarPalettes::enterEvent(QEvent *event)
                              {
                              movie->start();
                              }

                              void ToolBarPalettes::leaveEvent(QEvent *event)
                              {
                              movie->stop();
                              animatedButton->setIcon(QPixmap("../IMG/still-picture.png"));
                              }
                              @

                              --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                              If you have a question please use the forum so others can benefit from the solution in the future

                              1 Reply Last reply
                              0
                              • W Offline
                                W Offline
                                wallacesoh
                                wrote on last edited by
                                #15

                                Thanks raven-worx! For now, I am trying out the event handler method which works perfectly. I did not include @movie->stop();@ which stops the animation upon start of the application.

                                But I shall try your proposed stylesheet method as an alternative solution.

                                Thanks alot! :)

                                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