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. QLabel signals, linkActivated and linkHovered
Forum Updated to NodeBB v4.3 + New Features

QLabel signals, linkActivated and linkHovered

Scheduled Pinned Locked Moved Solved General and Desktop
31 Posts 4 Posters 6.2k Views 2 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.
  • B Bonnie

    @SPlatten
    Fine, I've updated the testing code in the above.
    But the output is still the same.
    My current project started from 5.12, so I have only 5.12 installed.

    SPlattenS Offline
    SPlattenS Offline
    SPlatten
    wrote on last edited by
    #13

    @Bonnie , ok, thanks, so its only the version that is different. Shouldn't be to hard for anyone with the latest version to try.

    Kind Regards,
    Sy

    1 Reply Last reply
    0
    • J.HilkJ J.Hilk

      @SPlatten QWidget is the base class of QLabel and its where they are declared

      IIRC you also have to set https://doc.qt.io/qt-5/qwidget.html#mouseTracking-prop
      to true, to receive the enter and exit events

      SPlattenS Offline
      SPlattenS Offline
      SPlatten
      wrote on last edited by SPlatten
      #14

      @J-Hilk , I've tried:

      cnSignal = QObject::connect(this, &clsQtLabel::enterEvent
                                 ,this, &clsQtLabel::rptrEnterEvent);
      

      clsQtLabel is the name of my derived class. The slot:

      void clsQtLabel::rptrEnterEvent(QEvent* pEvent) {
          const QString cstrSignal("enterEvent");
          QJsonObject objJSON;
          if ( mpobjNode->blnCheckSubscribers(cstrSignal, &objJSON) == true ) {
              QJsonObject objParam;
              //objParam["event"] = strLink;
              objJSON[clsXMLnode::mscszAttrParameters] = objParam;
              emit mpobjNode->commonRptdSignal(objJSON);
          }
      }
      

      Something is wrong because the connect returns null and does not connect. This is from:

      ```
      

      QMetaObject::Connection clsQtLabel::connect(clsSignal* pobjSignal) {
      QMetaObject::Connection cnSignal;
      if ( pobjSignal == nullptr ) {
      //Cannot proceed without signal or subscriber, abort!
      return cnSignal;
      }
      QString strSignal = pobjSignal->strGetSignal();
      if ( strSignal.compare(clsQtLabel::mscszQtSignalEnterEvent) == 0 ) {
      cnSignal = QObject::connect(this, &clsQtLabel::enterEvent
      ,this, &clsQtLabel::rptrEnterEvent);
      } else if ( strSignal.compare(clsQtLabel::mscszQtSignalLinkActivated) == 0 ) {
      cnSignal = QObject::connect(this, &clsQtLabel::linkActivated
      ,this, &clsQtLabel::rptrLinkActivated);
      } else if ( strSignal.compare(clsQtLabel::mscszQtSignalLinkHovered) == 0 ) {
      cnSignal = QObject::connect(this, &clsQtLabel::linkHovered
      ,this, &clsQtLabel::rptrLinkHovered);
      }
      return cnSignal;
      }

      Kind Regards,
      Sy

      J.HilkJ mrjjM 2 Replies Last reply
      0
      • SPlattenS SPlatten

        @J-Hilk , I've tried:

        cnSignal = QObject::connect(this, &clsQtLabel::enterEvent
                                   ,this, &clsQtLabel::rptrEnterEvent);
        

        clsQtLabel is the name of my derived class. The slot:

        void clsQtLabel::rptrEnterEvent(QEvent* pEvent) {
            const QString cstrSignal("enterEvent");
            QJsonObject objJSON;
            if ( mpobjNode->blnCheckSubscribers(cstrSignal, &objJSON) == true ) {
                QJsonObject objParam;
                //objParam["event"] = strLink;
                objJSON[clsXMLnode::mscszAttrParameters] = objParam;
                emit mpobjNode->commonRptdSignal(objJSON);
            }
        }
        

        Something is wrong because the connect returns null and does not connect. This is from:

        ```
        

        QMetaObject::Connection clsQtLabel::connect(clsSignal* pobjSignal) {
        QMetaObject::Connection cnSignal;
        if ( pobjSignal == nullptr ) {
        //Cannot proceed without signal or subscriber, abort!
        return cnSignal;
        }
        QString strSignal = pobjSignal->strGetSignal();
        if ( strSignal.compare(clsQtLabel::mscszQtSignalEnterEvent) == 0 ) {
        cnSignal = QObject::connect(this, &clsQtLabel::enterEvent
        ,this, &clsQtLabel::rptrEnterEvent);
        } else if ( strSignal.compare(clsQtLabel::mscszQtSignalLinkActivated) == 0 ) {
        cnSignal = QObject::connect(this, &clsQtLabel::linkActivated
        ,this, &clsQtLabel::rptrLinkActivated);
        } else if ( strSignal.compare(clsQtLabel::mscszQtSignalLinkHovered) == 0 ) {
        cnSignal = QObject::connect(this, &clsQtLabel::linkHovered
        ,this, &clsQtLabel::rptrLinkHovered);
        }
        return cnSignal;
        }

        J.HilkJ Offline
        J.HilkJ Offline
        J.Hilk
        Moderators
        wrote on last edited by
        #15

        @SPlatten enterEvent is not a signal but a function. it gets called automatically and you're supposed to override it!


        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


        Q: What's that?
        A: It's blue light.
        Q: What does it do?
        A: It turns blue.

        1 Reply Last reply
        3
        • SPlattenS SPlatten

          @J-Hilk , I've tried:

          cnSignal = QObject::connect(this, &clsQtLabel::enterEvent
                                     ,this, &clsQtLabel::rptrEnterEvent);
          

          clsQtLabel is the name of my derived class. The slot:

          void clsQtLabel::rptrEnterEvent(QEvent* pEvent) {
              const QString cstrSignal("enterEvent");
              QJsonObject objJSON;
              if ( mpobjNode->blnCheckSubscribers(cstrSignal, &objJSON) == true ) {
                  QJsonObject objParam;
                  //objParam["event"] = strLink;
                  objJSON[clsXMLnode::mscszAttrParameters] = objParam;
                  emit mpobjNode->commonRptdSignal(objJSON);
              }
          }
          

          Something is wrong because the connect returns null and does not connect. This is from:

          ```
          

          QMetaObject::Connection clsQtLabel::connect(clsSignal* pobjSignal) {
          QMetaObject::Connection cnSignal;
          if ( pobjSignal == nullptr ) {
          //Cannot proceed without signal or subscriber, abort!
          return cnSignal;
          }
          QString strSignal = pobjSignal->strGetSignal();
          if ( strSignal.compare(clsQtLabel::mscszQtSignalEnterEvent) == 0 ) {
          cnSignal = QObject::connect(this, &clsQtLabel::enterEvent
          ,this, &clsQtLabel::rptrEnterEvent);
          } else if ( strSignal.compare(clsQtLabel::mscszQtSignalLinkActivated) == 0 ) {
          cnSignal = QObject::connect(this, &clsQtLabel::linkActivated
          ,this, &clsQtLabel::rptrLinkActivated);
          } else if ( strSignal.compare(clsQtLabel::mscszQtSignalLinkHovered) == 0 ) {
          cnSignal = QObject::connect(this, &clsQtLabel::linkHovered
          ,this, &clsQtLabel::rptrLinkHovered);
          }
          return cnSignal;
          }

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

          @SPlatten
          Hi
          enter and leave events are virtual functions and not signals.
          hehe ninjaed by @J-Hilk :)

          SPlattenS 1 Reply Last reply
          2
          • mrjjM mrjj

            @SPlatten
            Hi
            enter and leave events are virtual functions and not signals.
            hehe ninjaed by @J-Hilk :)

            SPlattenS Offline
            SPlattenS Offline
            SPlatten
            wrote on last edited by
            #17

            @mrjj , bugger, why why why?

            Kind Regards,
            Sy

            mrjjM 1 Reply Last reply
            0
            • SPlattenS SPlatten

              @mrjj , bugger, why why why?

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

              @SPlatten
              That is just normal OOP.
              Also, one can subclass and emit a signal in those event handlers to have it as signals also.
              But default its not signals :)

              SPlattenS 1 Reply Last reply
              1
              • mrjjM mrjj

                @SPlatten
                That is just normal OOP.
                Also, one can subclass and emit a signal in those event handlers to have it as signals also.
                But default its not signals :)

                SPlattenS Offline
                SPlattenS Offline
                SPlatten
                wrote on last edited by
                #19

                @mrjj , what I meant was why do it a different way when signals and slots are used for so much of everything else already?

                Kind Regards,
                Sy

                mrjjM 1 Reply Last reply
                0
                • SPlattenS SPlatten

                  @mrjj , what I meant was why do it a different way when signals and slots are used for so much of everything else already?

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

                  @SPlatten
                  well one reason is that signal and slot cannot return values as such.
                  So it wont be useful for normal OOP where you overwrite virtual functions to alter logic.
                  Its not easy to do with signals alone. Also very, very often you want to call base class version of the function you overrride as you only want to extend it and keep old logic too and in this case a signal system would be very clunky.

                  btw. in your use case if you want hover events but dont feel like subclassing. you could use eventfilter and cheat that way.

                  SPlattenS 1 Reply Last reply
                  1
                  • mrjjM mrjj

                    @SPlatten
                    well one reason is that signal and slot cannot return values as such.
                    So it wont be useful for normal OOP where you overwrite virtual functions to alter logic.
                    Its not easy to do with signals alone. Also very, very often you want to call base class version of the function you overrride as you only want to extend it and keep old logic too and in this case a signal system would be very clunky.

                    btw. in your use case if you want hover events but dont feel like subclassing. you could use eventfilter and cheat that way.

                    SPlattenS Offline
                    SPlattenS Offline
                    SPlatten
                    wrote on last edited by
                    #21

                    @mrjj , thanks, I'm no newb when it comes to coding, but in this case I fail to see why enterEvent couldn't be a signal, its perfect for it.

                    Kind Regards,
                    Sy

                    mrjjM 1 Reply Last reply
                    0
                    • SPlattenS SPlatten

                      @mrjj , thanks, I'm no newb when it comes to coding, but in this case I fail to see why enterEvent couldn't be a signal, its perfect for it.

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

                      @SPlatten
                      Well often its used for hover effect and used internally by same Widget so im not sure
                      its a universal use case.
                      But good news is that you can make them signals :)
                      If you want.

                      SPlattenS 1 Reply Last reply
                      0
                      • mrjjM mrjj

                        @SPlatten
                        Well often its used for hover effect and used internally by same Widget so im not sure
                        its a universal use case.
                        But good news is that you can make them signals :)
                        If you want.

                        SPlattenS Offline
                        SPlattenS Offline
                        SPlatten
                        wrote on last edited by
                        #23

                        @mrjj , this is my implementation:

                        void clsQtLabel::enterEvent(QEvent* pEvent) {
                            QString strLink;
                            if ( pEvent->type() == QEvent::Enter ) {
                                strLink = text();
                                emit linkHovered(strLink);
                            } else if ( pEvent->type() == QEvent::Leave ) {
                                emit linkHovered(strLink);
                            }
                        }
                        

                        Now I still have my connect code in place for:

                        cnSignal = QObject::connect(this, &clsQtLabel::linkHovered
                                                   ,this, &clsQtLabel::rptrLinkHovered);
                        

                        It still doesn't get into my slot.

                        Kind Regards,
                        Sy

                        mrjjM 1 Reply Last reply
                        0
                        • SPlattenS SPlatten

                          @mrjj , this is my implementation:

                          void clsQtLabel::enterEvent(QEvent* pEvent) {
                              QString strLink;
                              if ( pEvent->type() == QEvent::Enter ) {
                                  strLink = text();
                                  emit linkHovered(strLink);
                              } else if ( pEvent->type() == QEvent::Leave ) {
                                  emit linkHovered(strLink);
                              }
                          }
                          

                          Now I still have my connect code in place for:

                          cnSignal = QObject::connect(this, &clsQtLabel::linkHovered
                                                     ,this, &clsQtLabel::rptrLinkHovered);
                          

                          It still doesn't get into my slot.

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

                          @SPlatten said in QLabel signals, linkActivated and linkHovered:

                          emit linkHovered(strLink);

                          does it execute this line?

                          SPlattenS 1 Reply Last reply
                          0
                          • mrjjM mrjj

                            @SPlatten said in QLabel signals, linkActivated and linkHovered:

                            emit linkHovered(strLink);

                            does it execute this line?

                            SPlattenS Offline
                            SPlattenS Offline
                            SPlatten
                            wrote on last edited by
                            #25

                            @mrjj Yes, verified in debugger.

                            Kind Regards,
                            Sy

                            mrjjM 1 Reply Last reply
                            0
                            • SPlattenS SPlatten

                              @mrjj Yes, verified in debugger.

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

                              @SPlatten
                              maybe its due to reusing the signal. not sure.
                              Does connect return valid ?

                              1 Reply Last reply
                              0
                              • SPlattenS Offline
                                SPlattenS Offline
                                SPlatten
                                wrote on last edited by
                                #27

                                @mrjj , resolved now, I was just in to much of a hurry and making silly mistakes.

                                Kind Regards,
                                Sy

                                mrjjM 1 Reply Last reply
                                2
                                • SPlattenS SPlatten

                                  @mrjj , resolved now, I was just in to much of a hurry and making silly mistakes.

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

                                  @SPlatten
                                  we all been there , done that :)

                                  1 Reply Last reply
                                  2
                                  • SPlattenS Offline
                                    SPlattenS Offline
                                    SPlatten
                                    wrote on last edited by SPlatten
                                    #29

                                    Now thats fixed, more testing and with the same label which has been set-up as link to the Google website by setting the text to:

                                    %3ca href%3d%22http://google.com%22%3eGoogle%3c/a%3e
                                    

                                    and calling the function:

                                    setOpenExternalLinks
                                    

                                    I'm connecting the signals:

                                    linkActivated and linkHovered
                                    

                                    I've verified that the connection to each is successful by examining the return from the connect calls. The linkHovered now works perfectly, but I'm not getting the linkActivated when I click on the link, I have a breakpoint in the slot and it never gets there, the browser is launched correctly with the Google web-site.

                                    I found this:
                                    https://stackoverflow.com/questions/16581425/insert-clickable-link-in-qlabel-and-detect-click-on-this-link-to-provoke-an-acti

                                    And calling setOpenExternalLinks with false does allow the linkActivated signal to function correctly, but then it doesn't open the browser. This looks like a bug as I cannot see why you would have a linkActivated signal that only works when the label is not configured to function as a link.

                                    Kind Regards,
                                    Sy

                                    mrjjM 1 Reply Last reply
                                    0
                                    • SPlattenS SPlatten

                                      Now thats fixed, more testing and with the same label which has been set-up as link to the Google website by setting the text to:

                                      %3ca href%3d%22http://google.com%22%3eGoogle%3c/a%3e
                                      

                                      and calling the function:

                                      setOpenExternalLinks
                                      

                                      I'm connecting the signals:

                                      linkActivated and linkHovered
                                      

                                      I've verified that the connection to each is successful by examining the return from the connect calls. The linkHovered now works perfectly, but I'm not getting the linkActivated when I click on the link, I have a breakpoint in the slot and it never gets there, the browser is launched correctly with the Google web-site.

                                      I found this:
                                      https://stackoverflow.com/questions/16581425/insert-clickable-link-in-qlabel-and-detect-click-on-this-link-to-provoke-an-acti

                                      And calling setOpenExternalLinks with false does allow the linkActivated signal to function correctly, but then it doesn't open the browser. This looks like a bug as I cannot see why you would have a linkActivated signal that only works when the label is not configured to function as a link.

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

                                      @SPlatten said in QLabel signals, linkActivated and linkHovered:

                                      setOpenExternalLinks

                                      Hi
                                      Docs says
                                      "Specifies whether QLabel should automatically open links using QDesktopServices::openUrl() instead of emitting the linkActivated() signal."
                                      So that seems as expected.

                                      SPlattenS 1 Reply Last reply
                                      3
                                      • mrjjM mrjj

                                        @SPlatten said in QLabel signals, linkActivated and linkHovered:

                                        setOpenExternalLinks

                                        Hi
                                        Docs says
                                        "Specifies whether QLabel should automatically open links using QDesktopServices::openUrl() instead of emitting the linkActivated() signal."
                                        So that seems as expected.

                                        SPlattenS Offline
                                        SPlattenS Offline
                                        SPlatten
                                        wrote on last edited by
                                        #31

                                        @mrjj , thank you.

                                        Kind Regards,
                                        Sy

                                        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