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. Interfaces must inherit QObject?!
Forum Updated to NodeBB v4.3 + New Features

Interfaces must inherit QObject?!

Scheduled Pinned Locked Moved Solved General and Desktop
24 Posts 5 Posters 4.3k 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.
  • idlefrogI idlefrog

    @JonB Yes, I also thought I would end up (eventually) in a catch 22 situation with diamond inheritance all over the shop! Thank goodness a simple inheritance reordering did the trick! :)

    KroMignonK Offline
    KroMignonK Offline
    KroMignon
    wrote on last edited by
    #6

    @idlefrog said in Interfaces must inherit QObject?!:

    Thank goodness a simple inheritance reordering did the trick! :)

    I don't remember where I found this in Qt documentation (and not remember why), but QObject (or a QObject based class) must be the first class in inheritance list.

    It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

    JonBJ 1 Reply Last reply
    0
    • KroMignonK KroMignon

      @idlefrog said in Interfaces must inherit QObject?!:

      Thank goodness a simple inheritance reordering did the trick! :)

      I don't remember where I found this in Qt documentation (and not remember why), but QObject (or a QObject based class) must be the first class in inheritance list.

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #7

      @KroMignon
      I should like a reference for this. So far as I know multiple inheritance from QObject is not supported. See for example QObject Multiple Inheritance. This is required by moc, perhaps we will see where the OP gets over time.

      The suggested solution there shows "the Qt way" of implementing what I think @idlefrog is trying to achieve, avoiding the multiple inheritance.

      idlefrogI JKSHJ 2 Replies Last reply
      1
      • JonBJ JonB

        @KroMignon
        I should like a reference for this. So far as I know multiple inheritance from QObject is not supported. See for example QObject Multiple Inheritance. This is required by moc, perhaps we will see where the OP gets over time.

        The suggested solution there shows "the Qt way" of implementing what I think @idlefrog is trying to achieve, avoiding the multiple inheritance.

        idlefrogI Offline
        idlefrogI Offline
        idlefrog
        wrote on last edited by
        #8

        @JonB Thanks for the link... it's a interesting reference. The composition solution might be handy, although looks a bit un-Qt-ish if there is such a thing! :)

        1 Reply Last reply
        0
        • JonBJ JonB

          @KroMignon
          I should like a reference for this. So far as I know multiple inheritance from QObject is not supported. See for example QObject Multiple Inheritance. This is required by moc, perhaps we will see where the OP gets over time.

          The suggested solution there shows "the Qt way" of implementing what I think @idlefrog is trying to achieve, avoiding the multiple inheritance.

          JKSHJ Offline
          JKSHJ Offline
          JKSH
          Moderators
          wrote on last edited by JKSH
          #9

          @KroMignon said in Interfaces must inherit QObject?!:

          I don't remember where I found this in Qt documentation (and not remember why), but QObject (or a QObject based class) must be the first class in inheritance list.

          ...

          @JonB said in Interfaces must inherit QObject?!:

          I should like a reference for this.

          https://doc.qt.io/qt-5/moc.html#multiple-inheritance-requires-qobject-to-be-first

          Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

          JonBJ 1 Reply Last reply
          4
          • JKSHJ JKSH

            @KroMignon said in Interfaces must inherit QObject?!:

            I don't remember where I found this in Qt documentation (and not remember why), but QObject (or a QObject based class) must be the first class in inheritance list.

            ...

            @JonB said in Interfaces must inherit QObject?!:

            I should like a reference for this.

            https://doc.qt.io/qt-5/moc.html#multiple-inheritance-requires-qobject-to-be-first

            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on last edited by JonB
            #10

            @JKSH said in Interfaces must inherit QObject?!:

            https://doc.qt.io/qt-5/moc.html#multiple-inheritance-requires-qobject-to-be-first

            If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.

            Thank you for this reference. However, unless I read it wrong, this does not address the @idlefrog's case or @KroMignon's solution.

            In the example in the docs

            class SomeClass : public QObject, public OtherClass
            

            Here there is no indication that the second class, OtherClass, itself inherits QObject. And it states explicitly

            Also, be sure that only the first inherited class is a QObject.

            @idlefrog is asking specifically about multiple inheritance where both classes come from QObject, and that is what i was trying to answer.

            I see that several members, including @kshegunov, have up-voted your post. I would welcome clarification on this issue, please, as my understand is that multiple inheritance where both involve QObject is not supported, regardless of ordering?

            KroMignonK kshegunovK 2 Replies Last reply
            0
            • JonBJ JonB

              @JKSH said in Interfaces must inherit QObject?!:

              https://doc.qt.io/qt-5/moc.html#multiple-inheritance-requires-qobject-to-be-first

              If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.

              Thank you for this reference. However, unless I read it wrong, this does not address the @idlefrog's case or @KroMignon's solution.

              In the example in the docs

              class SomeClass : public QObject, public OtherClass
              

              Here there is no indication that the second class, OtherClass, itself inherits QObject. And it states explicitly

              Also, be sure that only the first inherited class is a QObject.

              @idlefrog is asking specifically about multiple inheritance where both classes come from QObject, and that is what i was trying to answer.

              I see that several members, including @kshegunov, have up-voted your post. I would welcome clarification on this issue, please, as my understand is that multiple inheritance where both involve QObject is not supported, regardless of ordering?

              KroMignonK Offline
              KroMignonK Offline
              KroMignon
              wrote on last edited by
              #11

              @JonB said in Interfaces must inherit QObject?!:

              I see that several members, including @kshegunov, have up-voted your post. I would welcome clarification on this issue, please, as my understand is that multiple inheritance where both involve QObject is not supported, regardless of ordering?

              I up-voted @JKSH post, because it gives the link to documentation I talking about.
              But, the reply to your question: according to documentation QObject multiple inheritance (diamond inheritance) is not allowed/possible.

              It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

              JonBJ 1 Reply Last reply
              1
              • KroMignonK KroMignon

                @JonB said in Interfaces must inherit QObject?!:

                I see that several members, including @kshegunov, have up-voted your post. I would welcome clarification on this issue, please, as my understand is that multiple inheritance where both involve QObject is not supported, regardless of ordering?

                I up-voted @JKSH post, because it gives the link to documentation I talking about.
                But, the reply to your question: according to documentation QObject multiple inheritance (diamond inheritance) is not allowed/possible.

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by
                #12

                @KroMignon Thanks @Kro, understood, I'm just seeking clarification because this is all getting a bit muddy.... :)

                1 Reply Last reply
                0
                • idlefrogI Offline
                  idlefrogI Offline
                  idlefrog
                  wrote on last edited by
                  #13

                  It seems to me that for a class where you inherited perhaps a set of interfaces and one QObject, you can't inherit any other QObject class. e.g.

                  class RealCake: public QObject, public ICake, public IEdible{}
                  
                  class PlasticCake: public QObject, public ICake {}
                  
                  class JokeCake: public PlasticCake, public RealCake{}
                  

                  The JokeCake is not allowed in the world of Qt. Pity!

                  kshegunovK JonBJ 2 Replies Last reply
                  0
                  • JonBJ JonB

                    @JKSH said in Interfaces must inherit QObject?!:

                    https://doc.qt.io/qt-5/moc.html#multiple-inheritance-requires-qobject-to-be-first

                    If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.

                    Thank you for this reference. However, unless I read it wrong, this does not address the @idlefrog's case or @KroMignon's solution.

                    In the example in the docs

                    class SomeClass : public QObject, public OtherClass
                    

                    Here there is no indication that the second class, OtherClass, itself inherits QObject. And it states explicitly

                    Also, be sure that only the first inherited class is a QObject.

                    @idlefrog is asking specifically about multiple inheritance where both classes come from QObject, and that is what i was trying to answer.

                    I see that several members, including @kshegunov, have up-voted your post. I would welcome clarification on this issue, please, as my understand is that multiple inheritance where both involve QObject is not supported, regardless of ordering?

                    kshegunovK Offline
                    kshegunovK Offline
                    kshegunov
                    Moderators
                    wrote on last edited by kshegunov
                    #14

                    @JonB said in Interfaces must inherit QObject?!:

                    I see that several members, including @kshegunov, have up-voted your post. I would welcome clarification on this issue, please, as my understand is that multiple inheritance where both involve QObject is not supported, regardless of ordering?

                    If both classes inherit from QObject you enter virtual-inheritance-land, where the night is dark and full of terrors ... and it's simply not supported by moc (last sentence of the mentioned link). Otherwise multiple inheritance is fine, good, expected and so on (provided you use it properly), and is supported both by the language and by Qt with the minor note about base class order.

                    Read and abide by the Qt Code of Conduct

                    1 Reply Last reply
                    0
                    • idlefrogI idlefrog

                      It seems to me that for a class where you inherited perhaps a set of interfaces and one QObject, you can't inherit any other QObject class. e.g.

                      class RealCake: public QObject, public ICake, public IEdible{}
                      
                      class PlasticCake: public QObject, public ICake {}
                      
                      class JokeCake: public PlasticCake, public RealCake{}
                      

                      The JokeCake is not allowed in the world of Qt. Pity!

                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by
                      #15

                      @idlefrog said in Interfaces must inherit QObject?!:

                      The JokeCake is not allowed in the world of Qt. Pity!

                      Even if it were allowed, you're using it incorrectly. C++ is hard, man, it's just the way it is.

                      Read and abide by the Qt Code of Conduct

                      1 Reply Last reply
                      0
                      • idlefrogI idlefrog

                        It seems to me that for a class where you inherited perhaps a set of interfaces and one QObject, you can't inherit any other QObject class. e.g.

                        class RealCake: public QObject, public ICake, public IEdible{}
                        
                        class PlasticCake: public QObject, public ICake {}
                        
                        class JokeCake: public PlasticCake, public RealCake{}
                        

                        The JokeCake is not allowed in the world of Qt. Pity!

                        JonBJ Offline
                        JonBJ Offline
                        JonB
                        wrote on last edited by
                        #16

                        @idlefrog
                        Yes indeed that is precisely my understanding (unless mistaken). You must not inherit multiple times from QObejct, whether directly or indirectly, and regardless of order. Because of moc requirement/limitation.

                        I still refer you back to QObject Multiple Inheritance. Ah, hang on, I think the solution I had in mind is at https://stackoverflow.com/a/18113601/489865 "the Qt way of doing this is like this...." But now I see that includes

                        I am amazed that this actually works, but bummed out by the fact that it requires the old-style SIGNAL()/SLOT() syntax...

                        [Not my language!] Which is a bu**er :(

                        kshegunovK 1 Reply Last reply
                        0
                        • JonBJ JonB

                          @idlefrog
                          Yes indeed that is precisely my understanding (unless mistaken). You must not inherit multiple times from QObejct, whether directly or indirectly, and regardless of order. Because of moc requirement/limitation.

                          I still refer you back to QObject Multiple Inheritance. Ah, hang on, I think the solution I had in mind is at https://stackoverflow.com/a/18113601/489865 "the Qt way of doing this is like this...." But now I see that includes

                          I am amazed that this actually works, but bummed out by the fact that it requires the old-style SIGNAL()/SLOT() syntax...

                          [Not my language!] Which is a bu**er :(

                          kshegunovK Offline
                          kshegunovK Offline
                          kshegunov
                          Moderators
                          wrote on last edited by kshegunov
                          #17

                          @JonB said in Interfaces must inherit QObject?!:

                          I still refer you back to QObject Multiple Inheritance. Ah, hang on, I think the solution I had in mind is at https://stackoverflow.com/a/18113601/489865 "the Qt way of doing this is like this...." But now I see that includes

                          This is simply an abomination. Signals act polymorphically without the need to declare them as pure virtual in interfaces. Slots are a different kettle of fish, they work just fine with overriding.

                          (Edit)
                          Addendum:

                          Yes indeed that is precisely my understanding (unless mistaken). You must not inherit multiple times from QObejct, whether directly or indirectly, and regardless of order. Because of moc requirement/limitation.

                          Just to spill it as explicitly and bluntly as I possibly can:
                          You shall not derive a class from the same base multiple times (directly or indirectly) if you don't intimately know what's the difference between:

                          class Derived : public Base
                          

                          and

                          class Derived : virtual public Base
                          

                          Read and abide by the Qt Code of Conduct

                          JonBJ 1 Reply Last reply
                          3
                          • kshegunovK kshegunov

                            @JonB said in Interfaces must inherit QObject?!:

                            I still refer you back to QObject Multiple Inheritance. Ah, hang on, I think the solution I had in mind is at https://stackoverflow.com/a/18113601/489865 "the Qt way of doing this is like this...." But now I see that includes

                            This is simply an abomination. Signals act polymorphically without the need to declare them as pure virtual in interfaces. Slots are a different kettle of fish, they work just fine with overriding.

                            (Edit)
                            Addendum:

                            Yes indeed that is precisely my understanding (unless mistaken). You must not inherit multiple times from QObejct, whether directly or indirectly, and regardless of order. Because of moc requirement/limitation.

                            Just to spill it as explicitly and bluntly as I possibly can:
                            You shall not derive a class from the same base multiple times (directly or indirectly) if you don't intimately know what's the difference between:

                            class Derived : public Base
                            

                            and

                            class Derived : virtual public Base
                            
                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by JonB
                            #18

                            @kshegunov
                            Yeah, I didn't notice the virtual on the signal. That's the trouble with assuming an accepted solution with 60 up-votes must be good!

                            It shows a lot of people are obviously struggling with this. How then can the OP here arrange to write an "interface" which inherits from QObject and apply it to classes which inherit from QObject too?

                            Ohhhh, maybe I misunderstood? Only now do I see that OP did not originally say that ICake needed QObject itself. Only that he put it first in the class inheritance list before QObject and that upset moc. I get it now, and why public QObject, public ICake works here. OK, but what about if OP did want multiple QObject inheritance, any way without the "abomination" ?

                            kshegunovK 1 Reply Last reply
                            0
                            • JonBJ JonB

                              @kshegunov
                              Yeah, I didn't notice the virtual on the signal. That's the trouble with assuming an accepted solution with 60 up-votes must be good!

                              It shows a lot of people are obviously struggling with this. How then can the OP here arrange to write an "interface" which inherits from QObject and apply it to classes which inherit from QObject too?

                              Ohhhh, maybe I misunderstood? Only now do I see that OP did not originally say that ICake needed QObject itself. Only that he put it first in the class inheritance list before QObject and that upset moc. I get it now, and why public QObject, public ICake works here. OK, but what about if OP did want multiple QObject inheritance, any way without the "abomination" ?

                              kshegunovK Offline
                              kshegunovK Offline
                              kshegunov
                              Moderators
                              wrote on last edited by
                              #19

                              @JonB said in Interfaces must inherit QObject?!:

                              OK, but what about if OP did want multiple QObject inheritnace, any way without the "abomination" ?

                              He shan't do it. Also read the addendum I added to my previous post.

                              Read and abide by the Qt Code of Conduct

                              JonBJ 1 Reply Last reply
                              0
                              • kshegunovK kshegunov

                                @JonB said in Interfaces must inherit QObject?!:

                                OK, but what about if OP did want multiple QObject inheritnace, any way without the "abomination" ?

                                He shan't do it. Also read the addendum I added to my previous post.

                                JonBJ Offline
                                JonBJ Offline
                                JonB
                                wrote on last edited by
                                #20

                                @kshegunov
                                Is that a requirement of C++? The OP claimed

                                class VictoriaSpongeCake : public ICake, public QObject
                                

                                So if I change ICake to inherit like this:

                                class ICake: public QObject
                                

                                It all compiles without a problem.

                                That is not quoting me, it is quoting him.

                                kshegunovK JKSHJ 2 Replies Last reply
                                0
                                • JonBJ JonB

                                  @kshegunov
                                  Is that a requirement of C++? The OP claimed

                                  class VictoriaSpongeCake : public ICake, public QObject
                                  

                                  So if I change ICake to inherit like this:

                                  class ICake: public QObject
                                  

                                  It all compiles without a problem.

                                  That is not quoting me, it is quoting him.

                                  kshegunovK Offline
                                  kshegunovK Offline
                                  kshegunov
                                  Moderators
                                  wrote on last edited by kshegunov
                                  #21

                                  @JonB said in Interfaces must inherit QObject?!:

                                  Is that a requirement of C++?

                                  It is not a requirement, but there's a significant difference.
                                  Here's links, I know you love them sources:
                                  https://isocpp.org/wiki/faq/multiple-inheritance (What is the “dreaded diamond”? being key)
                                  https://en.cppreference.com/w/cpp/language/derived_class (Virtual base classes is relevant)

                                  Read and abide by the Qt Code of Conduct

                                  JonBJ 1 Reply Last reply
                                  3
                                  • kshegunovK kshegunov

                                    @JonB said in Interfaces must inherit QObject?!:

                                    Is that a requirement of C++?

                                    It is not a requirement, but there's a significant difference.
                                    Here's links, I know you love them sources:
                                    https://isocpp.org/wiki/faq/multiple-inheritance (What is the “dreaded diamond”? being key)
                                    https://en.cppreference.com/w/cpp/language/derived_class (Virtual base classes is relevant)

                                    JonBJ Offline
                                    JonBJ Offline
                                    JonB
                                    wrote on last edited by
                                    #22

                                    @kshegunov
                                    Yeah, thanks, this looks good. public virtual Base, that's a new one for me, I like it. The more complexity in C++ the better... ;-)

                                    1 Reply Last reply
                                    1
                                    • JonBJ JonB

                                      @kshegunov
                                      Is that a requirement of C++? The OP claimed

                                      class VictoriaSpongeCake : public ICake, public QObject
                                      

                                      So if I change ICake to inherit like this:

                                      class ICake: public QObject
                                      

                                      It all compiles without a problem.

                                      That is not quoting me, it is quoting him.

                                      JKSHJ Offline
                                      JKSHJ Offline
                                      JKSH
                                      Moderators
                                      wrote on last edited by JKSH
                                      #23

                                      @JonB said in Interfaces must inherit QObject?!:

                                      @kshegunov
                                      Is that a requirement of C++? The OP claimed

                                      class VictoriaSpongeCake : public ICake, public QObject
                                      

                                      So if I change ICake to inherit like this:

                                      class ICake: public QObject
                                      

                                      It all compiles without a problem.

                                      That is not quoting me, it is quoting him.

                                      OP forgot to re-run qmake (or delete the build directory) after making ICake inherit QObject and adding the Q_OBJECT macro.

                                      @JonB said in Interfaces must inherit QObject?!:

                                      How then can the OP here arrange to write an "interface" which inherits from QObject and apply it to classes which inherit from QObject too?

                                      They can't.

                                      QObjects are designed to be "identity objects", as opposed to "value objects": https://doc.qt.io/qt-5/object.html#qt-objects-identity-vs-value (for example, an image is a value but a window is an identity). I'd say that an "interface object" is neither an identity nor a value.

                                      One more thought: If a class inherits from 2 differnent QObjects, what should obj->staticMetaObject.superClass() return?

                                      P.S. I think you'll enjoy the thoroughness of this article: https://www.ics.com/blog/multiple-inheritance-qt

                                      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                                      JonBJ 1 Reply Last reply
                                      2
                                      • JKSHJ JKSH

                                        @JonB said in Interfaces must inherit QObject?!:

                                        @kshegunov
                                        Is that a requirement of C++? The OP claimed

                                        class VictoriaSpongeCake : public ICake, public QObject
                                        

                                        So if I change ICake to inherit like this:

                                        class ICake: public QObject
                                        

                                        It all compiles without a problem.

                                        That is not quoting me, it is quoting him.

                                        OP forgot to re-run qmake (or delete the build directory) after making ICake inherit QObject and adding the Q_OBJECT macro.

                                        @JonB said in Interfaces must inherit QObject?!:

                                        How then can the OP here arrange to write an "interface" which inherits from QObject and apply it to classes which inherit from QObject too?

                                        They can't.

                                        QObjects are designed to be "identity objects", as opposed to "value objects": https://doc.qt.io/qt-5/object.html#qt-objects-identity-vs-value (for example, an image is a value but a window is an identity). I'd say that an "interface object" is neither an identity nor a value.

                                        One more thought: If a class inherits from 2 differnent QObjects, what should obj->staticMetaObject.superClass() return?

                                        P.S. I think you'll enjoy the thoroughness of this article: https://www.ics.com/blog/multiple-inheritance-qt

                                        JonBJ Offline
                                        JonBJ Offline
                                        JonB
                                        wrote on last edited by
                                        #24

                                        @JKSH said in Interfaces must inherit QObject?!:

                                        OP forgot to re-run qmake (or delete the build directory) after making ICake inherit QObject and adding the Q_OBJECT macro.

                                        They can't.

                                        Thank you, this makes a lot more sense then!

                                        1 Reply Last reply
                                        1

                                        • Login

                                        • Login or register to search.
                                        • First post
                                          Last post
                                        0
                                        • Categories
                                        • Recent
                                        • Tags
                                        • Popular
                                        • Users
                                        • Groups
                                        • Search
                                        • Get Qt Extensions
                                        • Unsolved