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. fail to use Q_OBJECT Macro in CMake Project
QtWS25 Last Chance

fail to use Q_OBJECT Macro in CMake Project

Scheduled Pinned Locked Moved Unsolved General and Desktop
moccmakeqobject
14 Posts 4 Posters 9.7k Views
  • 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.
  • S Offline
    S Offline
    SGaist
    Lifetime Qt Champion
    wrote on 24 Nov 2017, 21:54 last edited by
    #4

    Hi,

    Did you already took a look at the CMake Manual from Qt's documentation ?

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

    V 1 Reply Last reply 27 Nov 2017, 14:57
    0
    • S Offline
      S Offline
      Sewing
      wrote on 27 Nov 2017, 11:07 last edited by
      #5

      I did, but without being able to infer any conclusive hints from the article towards a solution for my problem

      1 Reply Last reply
      0
      • V Offline
        V Offline
        VRonin
        wrote on 27 Nov 2017, 12:35 last edited by VRonin
        #6

        The problem is not CMake:

        @Sewing said in fail to use Q_OBJECT Macro in CMake Project:

        mainWindow.cpp: The file contains a Q_OBJECT macro

        from http://doc.qt.io/qt-5/moc.html

        The moc tool reads a C++ header file.

        Did you declare a class with Q_OBJECT in a .cpp file? if so either yo do as the compiler tells you and #include "mainWindow.moc" (this file name might change depending on how moc gets invoked) at the end of the file or, as I would recommend, move it into a header

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        1 Reply Last reply
        4
        • S Offline
          S Offline
          Sewing
          wrote on 27 Nov 2017, 13:12 last edited by
          #7

          Mh difficult since I employ the pimpl idiom in which the nested implementation class in defined entirely within the source file

          V 1 Reply Last reply 27 Nov 2017, 13:29
          0
          • S Offline
            S Offline
            SGaist
            Lifetime Qt Champion
            wrote on 27 Nov 2017, 13:17 last edited by
            #8

            Then move the private declaration part in its own header that you only include in the implementation part.

            Note that your MainWindow implementation looks a bit convoluted, you might be over-engineering some things.

            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
            2
            • S Offline
              S Offline
              Sewing
              wrote on 27 Nov 2017, 13:28 last edited by
              #9

              thank you for the help.

              you mean cuz of using pimpl? this is just a minimal example and my intention was, to keep the public interface of mainwindow.cpp quite clean and readable

              1 Reply Last reply
              0
              • S Sewing
                27 Nov 2017, 13:12

                Mh difficult since I employ the pimpl idiom in which the nested implementation class in defined entirely within the source file

                V Offline
                V Offline
                VRonin
                wrote on 27 Nov 2017, 13:29 last edited by
                #10

                @Sewing said in fail to use Q_OBJECT Macro in CMake Project:

                pimpl idiom in which the nested implementation class in defined entirely within the source file

                You can move it into a header file, Qt does it all the time, they use _p.h suffix to mark private headers. For example: QDateTimePrivate

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                2
                • S Offline
                  S Offline
                  Sewing
                  wrote on 27 Nov 2017, 14:42 last edited by
                  #11

                  so if I understood correctly, the reason of having to do this is that the Q_OBJECT Macro has to be defined in the header file instead of the source file?

                  and after doing so, is the line

                  set_target_properties(${PROJECT_NAME} PROPERTIES AUTOMOC TRUE)
                  

                  sufficient for invoking the MOC in my CMakeLists file?

                  1 Reply Last reply
                  0
                  • S SGaist
                    24 Nov 2017, 21:54

                    Hi,

                    Did you already took a look at the CMake Manual from Qt's documentation ?

                    V Offline
                    V Offline
                    VRonin
                    wrote on 27 Nov 2017, 14:57 last edited by
                    #12

                    @SGaist said in fail to use Q_OBJECT Macro in CMake Project:

                    Did you already took a look at the CMake Manual from Qt's documentation ?

                    @Sewing said in fail to use Q_OBJECT Macro in CMake Project:

                    I did

                    from http://doc.qt.io/qt-5/cmake-manual.html:

                    # Instruct CMake to run moc automatically when needed.
                    set(CMAKE_AUTOMOC ON)
                    

                    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                    ~Napoleon Bonaparte

                    On a crusade to banish setIndexWidget() from the holy land of Qt

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      Sewing
                      wrote on 27 Nov 2017, 15:00 last edited by
                      #13

                      I read that, just thought variables in CMake are old-style while target_properties are the modern way to handle things

                      V 1 Reply Last reply 27 Nov 2017, 15:06
                      0
                      • S Sewing
                        27 Nov 2017, 15:00

                        I read that, just thought variables in CMake are old-style while target_properties are the modern way to handle things

                        V Offline
                        V Offline
                        VRonin
                        wrote on 27 Nov 2017, 15:06 last edited by
                        #14

                        I heard opposing arguments to that when it comes to moc/rcc/uic. Personally, I use the set(CMAKE_AUTOMOC ON) way

                        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                        ~Napoleon Bonaparte

                        On a crusade to banish setIndexWidget() from the holy land of Qt

                        1 Reply Last reply
                        0

                        13/14

                        27 Nov 2017, 15:00

                        • Login

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