Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct

    Unsolved hovering over child widgets, Qt::WA_NoMousePropagation not working

    General and Desktop
    3
    21
    5239
    Loading More Posts
    • 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.
    • O
      OZaric last edited by

      Hi guys,
      I have recently posted a qt question on SO, but I did not get an answer there. It is quite important to me and i have already spent a lot of time with it, therefore i gonna try it here too. Following the question:

      I have a parent widget containing some child widgets. The problem I am facing is that when I hover over the child widgets, the parent widget is getting hovered too.

      So I have gone through Qt's doc and it says in http://doc.qt.io/archives/qt-4.8/qhoverevent.html that Qt::WA_NoMousePropagation is exactly what i need. But it's simply not working.

      Here is a basic example

      #include <QLabel>
      #include <QHBoxLayout>
      
      class Label : public QLabel
      {
      	Q_OBJECT
      
      public:
      	Label(QWidget *parent = Q_NULLPTR) :
      	    QLabel("parent",parent),
      	    childLabel(new QLabel("child"))
      	{
      	    this->setWindowState(Qt::WindowMaximized);
      	    childLabel->setAttribute(Qt::WA_NoMousePropagation); //<-not working
      	    childLabel->setObjectName("childLabel");
      	    auto hLayout = new QHBoxLayout;
      	    hLayout->addWidget(childLabel,0,Qt::AlignRight);
      	    hLayout->setContentsMargins(0,0,0,0);
      	    setLayout(hLayout);
      	    setStyleSheet(R"(
      	                  QLabel:hover{background-color: blue;}
      	                  #childLabel:hover{ background-color: yellow;}
      	                  )");
      	}
      	~Label() = default;
      private:
      	QLabel *childLabel;
      };
      

      Check it out and you will see that the parent is still hovered, when you hover the child... Am I missing here something or is Qt::WA_NoMousePropagation not working. Is there any workaround?

      Thank you in advance

      Best Regards

      1 Reply Last reply Reply Quote 0
      • mrjj
        mrjj Lifetime Qt Champion last edited by

        Hi and welcome to the forums.
        I will try in a moment, but since you already have a subclass, did you also try
        overriding void QWidget::enterEvent(QEvent * event)
        and set event as handled ?

        1 Reply Last reply Reply Quote 1
        • mrjj
          mrjj Lifetime Qt Champion last edited by

          Wait a minute
          class Label : public QLabel is parent
          childLabel(new QLabel("child")) is the QLabel you want to hover ?

          But you set the stylesheet to the parent (and it affects the QLabel child too)
          setStyleSheet(R"(
          QLabel:hover{background-color: blue;}
          #childLabel:hover{ background-color: yellow;}
          )");

          dont you mean

          childLabel->setStyleSheet(R"(
          QLabel:hover{background-color: blue;}
          #childLabel:hover{ background-color: yellow;}
          )");

          1 Reply Last reply Reply Quote 0
          • O
            OZaric last edited by OZaric

            Hi,
            Thank you for your fast reply !

            So what i want is to be able to hover both, but seperately, when mouse is over the child(childLabel) it should only! hover the child else it should hover the widget(the Label). (e.g. like in the doc but HoverMove should be like MouseMove)
            More or less i do not want the childLabel's HoverMove to be propagated to its parent

            I have considered reimplementing the enterEvent and somehow go on with comparing with HoverMove, but it is written in the doc that Qt::WA_NoMousePropagation attribute has to be set to get the desired effect. But I cant see any effect setting this attribute.

            1 Reply Last reply Reply Quote 0
            • mrjj
              mrjj Lifetime Qt Champion last edited by

              Hi
              Yes you are right. it should only hover one.
              Do you use class Label : public QLabel as the window ? ( and no mainwindow)
              (going to test it)

              1 Reply Last reply Reply Quote 0
              • O
                OZaric last edited by OZaric

                No, thats actually a bigger project, this was just a small illustrative example.
                I have ofc. a mainwindow and so on...
                I noticed this problem when i put a ComboBox(as selector) inside a StackedWidget. I am subclassing the widgets directly in order to inherit all the public members.
                I did something like this ...

                class StackedWidget : public QStackedWidget
                {
                    StackedWidget(...) {analogous to above example}
                    QComboBox pageComboBox;
                }
                
                1 Reply Last reply Reply Quote 0
                • mrjj
                  mrjj Lifetime Qt Champion last edited by

                  Hi
                  I agree - its a bit odd.
                  QLabel might have some special flag.
                  Did you try with Qwidgets ?

                  1 Reply Last reply Reply Quote 0
                  • O
                    OZaric last edited by

                    I have tried it with QComboBox/QStackedWidget because thats actually where i need it.

                    mrjj 1 Reply Last reply Reply Quote 0
                    • mrjj
                      mrjj Lifetime Qt Champion @OZaric last edited by

                      @OZaric
                      Just tried with QWidgets and mainwindow and indeed the mouse
                      bleed through.

                      1 Reply Last reply Reply Quote 1
                      • O
                        OZaric last edited by

                        Anyway Thank You for your time !

                        mrjj 1 Reply Last reply Reply Quote 0
                        • mrjj
                          mrjj Lifetime Qt Champion @OZaric last edited by

                          @OZaric
                          It seems that Qt::WA_NoMousePropagation have no effect
                          Im using Qt 5.10
                          What version are you testing with ?

                          1 Reply Last reply Reply Quote 0
                          • O
                            OZaric last edited by OZaric

                            I am working with Qt 5.9.3. I have here a few (including static builds), tested on all without success.

                            1 Reply Last reply Reply Quote 0
                            • mrjj
                              mrjj Lifetime Qt Champion last edited by mrjj

                              Hi
                              Seems parent widget always get a hover when you enter its area even if a child
                              is covering the entry area
                              alt text

                              Not sure its a bug or by design. Lets see what others say.

                              1 Reply Last reply Reply Quote 1
                              • SGaist
                                SGaist Lifetime Qt Champion last edited by SGaist

                                Hi,

                                Can you share your test sample ?

                                Interested in AI ? www.idiap.ch
                                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                1 Reply Last reply Reply Quote 0
                                • mrjj
                                  mrjj Lifetime Qt Champion last edited by

                                  Hi
                                  https://www.dropbox.com/s/egw6zy7lodscqr5/hovertest.zip?dl=0

                                  1 Reply Last reply Reply Quote 0
                                  • O
                                    OZaric last edited by

                                    Samuel Gaist, the qt legend :D
                                    I am reading you already for years in this forum!

                                    Check it out, it seems like setting attr Qt::WA_NoMousePropagation has no effect at all.

                                    1 Reply Last reply Reply Quote 0
                                    • SGaist
                                      SGaist Lifetime Qt Champion last edited by

                                      It is used in QComboBox.

                                      Did you already saw the QHoverEvent description especially the part about propagation ?

                                      Interested in AI ? www.idiap.ch
                                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      1 Reply Last reply Reply Quote 0
                                      • O
                                        OZaric last edited by OZaric

                                        It is used in QComboBox.

                                        Are you sure ? , because its not working for my QComboboxes neither!
                                        QComboBox Mouse is over the left history button in this picture.

                                        Did you already saw the QHoverEvent description especially the part about propagation ?

                                        I did. This link is actually also in my original question.

                                        1 Reply Last reply Reply Quote 0
                                        • mrjj
                                          mrjj Lifetime Qt Champion last edited by

                                          Hi
                                          The sample sets Qt::WA_NoMousePropagation on "CHILD"
                                          in mainwindows ctor but it made no difference.

                                          The CHILD label seems to be aligned with Parents client rect and in theory
                                          cursor should be able to enter the CHILD directly but i suspect the truth is
                                          that entering a widget always enters the parent first regardless of the visual
                                          representation.

                                          alt text

                                          1 Reply Last reply Reply Quote 0
                                          • SGaist
                                            SGaist Lifetime Qt Champion last edited by

                                            Sorry, I misread the link you used.

                                            As for QComboBox, yes I am. See here.

                                            Interested in AI ? www.idiap.ch
                                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post