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 emit parentWidget's signal from its child?
Forum Updated to NodeBB v4.3 + New Features

How to emit parentWidget's signal from its child?

Scheduled Pinned Locked Moved Solved General and Desktop
25 Posts 5 Posters 4.2k Views 3 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.
  • M mpergand

    @Emon-Haque said in How to emit parentWidget's signal from its child?:

    queryresult = new QueryResultView(this);
    ....

    What's behind ...
    I predicte nasty stuff here :)

    D Offline
    D Offline
    deleted385
    wrote on last edited by
    #16

    @mpergand, what?

    M 1 Reply Last reply
    0
    • D deleted385

      @mpergand, what?

      M Offline
      M Offline
      mpergand
      wrote on last edited by
      #17

      @Emon-Haque
      Are you sure QueryResultView is not reapparented
      What parent() prints at the end of the constructor ?

      D 1 Reply Last reply
      1
      • M mpergand

        @Emon-Haque
        Are you sure QueryResultView is not reapparented
        What parent() prints at the end of the constructor ?

        D Offline
        D Offline
        deleted385
        wrote on last edited by deleted385
        #18

        @mpergand, hmm

        qDebug() << parent() << parentWidget();
        QSplitter(0x425d470) QSplitter(0x425d470)
        

        so this actually has no meaning there! as soon as I add it in QSplitter split2->addWidget(queryresult);
        the splitter becomes its parent. Now I'll try to work with its grand parent and will let you know what happens.

        1 Reply Last reply
        0
        • M Offline
          M Offline
          mpergand
          wrote on last edited by mpergand
          #19

          Bingo, that's what I guess from the begining !

          void QSplitter::addWidget(QWidget *widget)
          Adds the given widget to the splitter's layout after all the other items.
          If widget is already in the splitter, it will be moved to the new position.
          Note: The splitter takes ownership of the widget.

          D 1 Reply Last reply
          1
          • M mpergand

            Bingo, that's what I guess from the begining !

            void QSplitter::addWidget(QWidget *widget)
            Adds the given widget to the splitter's layout after all the other items.
            If widget is already in the splitter, it will be moved to the new position.
            Note: The splitter takes ownership of the widget.

            D Offline
            D Offline
            deleted385
            wrote on last edited by
            #20

            @mpergand, now it gets into the slot of &TableWidget::onNoSelect

            auto scp = static_cast<QueryWidget*>(parent()->parent());
            emit scp->noSelect(query);
            qDebug() << parent()->parent() << parentWidget()->parent();
            

            and that qDebug prints:

            QueryWidget(0x2245c30, name = "Test") QueryWidget(0x2245c30, name = "Test")
            

            Thanks for the insight.

            1 Reply Last reply
            0
            • JonBJ JonB

              @Emon-Haque said in How to emit parentWidget's signal from its child?:

              BUT s got it right

              No, it did not! As I wrote, with static_cast<> " does not check or return nullptr, it takes your word for it. " But here you apparently lied to it, because the other two tell you that parentWidget() is not a QueryWidget*. So goodness knows what happens when you then go w->noSelect(). Do not use static_cast<>!

              So what is your QueryResultView, and what is its parentWidget() or parent()?

              Ah: queryresult = new QueryResultView(this);, so its parent should be a QueryWidget.

              Not[e] in both cases, parentWidget() and parent() the o and d are null

              I give up. parent() at least should be QueryWidget*. What class is QueryResultView derived from?

              Instead of puzzling over whether a signal is emitted, and whether that is connected to your slot, try calling some direct method of QueryWidget on the cast-pointer where you can check its result. For example, you could setObjectName() on queryWidget and then verify what a later objectName() off your pointer actually returns.

              D Offline
              D Offline
              deleted385
              wrote on last edited by
              #21

              @JonB, you asked for that parent / parentWidget BUT I didn't know at that point that If I set parent explicitly, it doesn't matter, the widget that contains my widget automatically becomes the parent.

              1 Reply Last reply
              0
              • D deleted385

                @J-Hilk, everywhere I've Q_OBJECT at the top like this:

                class MyObjectName : public QWidget{
                    Q_OBJECT
                public:
                ...
                

                Yes, you get those parent()/parentWidget() from QWidget. Philosophically, it could be bad design BUT if you could do so, it'll reduce significant amount of unnecessary code bloat.

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

                @Emon-Haque said in How to emit parentWidget's signal from its child?:

                Philosophically, it could be bad design BUT if you could do so, it'll reduce significant amount of unnecessary code bloat

                oh wow, are you also one of those that have everything public then?
                If inflexible, intervened spaghetti code is your style, fine enough.

                Anyway,
                I'm glad you got your issue solved!


                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.

                D 1 Reply Last reply
                2
                • J.HilkJ J.Hilk

                  @Emon-Haque said in How to emit parentWidget's signal from its child?:

                  Philosophically, it could be bad design BUT if you could do so, it'll reduce significant amount of unnecessary code bloat

                  oh wow, are you also one of those that have everything public then?
                  If inflexible, intervened spaghetti code is your style, fine enough.

                  Anyway,
                  I'm glad you got your issue solved!

                  D Offline
                  D Offline
                  deleted385
                  wrote on last edited by deleted385
                  #23

                  @J-Hilk, not only public when it's simple, a couple global as well. In other framework I've spent a couple of years and tried to keep the MVVM principle everywhere and what I realized is if I keep myself stuck in those principles it makes things harder so whenever necessary/simple I get out of those.

                  For example, if someone wants to show a dialog and want the result of the dialog for something else in some function, why would he create a dialog factory for that? Just instantiate a dialog and call show/exec in the place where necessary.

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    mchinand
                    wrote on last edited by
                    #24

                    Why don't use just make a signal/slot connection between the 'child' widget and the slot of whatever other QObject you want something triggered from the 'child' object. It makes it much clearer what's happening than relying on the parent-child, or even worse, grandparent-child relationships.

                    D 1 Reply Last reply
                    0
                    • M mchinand

                      Why don't use just make a signal/slot connection between the 'child' widget and the slot of whatever other QObject you want something triggered from the 'child' object. It makes it much clearer what's happening than relying on the parent-child, or even worse, grandparent-child relationships.

                      D Offline
                      D Offline
                      deleted385
                      wrote on last edited by deleted385
                      #25

                      @mchinand, in this case it'll be complicated. 2 separate main views (widgets in the stacked widget) rely on that signal. In between child widgets inside QueryWidget, that's ok.

                      TableWidget, which is not a child of QueryWidget, also relies on this signal and in the MainWindow, I instantiate QueryWidget and TableWidget. In this case, I either have to make the child widget of the QueryWidget, that emits the signal, public (or can make it more complex by creating a getter) or create another signal in QueryWidget to connect to the slot of TableWidget.

                      So, to me, the best approach is to make a signal in QueryWidget and let it be used by every other widgets that needs it, be it child or sibling.

                      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