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. MOC: signals and slots can't be on same line
Forum Updated to NodeBB v4.3 + New Features

MOC: signals and slots can't be on same line

Scheduled Pinned Locked Moved Unsolved General and Desktop
mocqt5.15.2linker errors
17 Posts 4 Posters 2.0k 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.
  • Christian EhrlicherC Online
    Christian EhrlicherC Online
    Christian Ehrlicher
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Feel free to provide a patch to moc for your usecase :)

    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
    Visit the Qt Academy at https://academy.qt.io/catalog

    M 1 Reply Last reply
    0
    • Christian EhrlicherC Christian Ehrlicher

      Feel free to provide a patch to moc for your usecase :)

      M Offline
      M Offline
      mattfbacon
      wrote on last edited by
      #3

      @Christian-Ehrlicher The issue I have is in regards to what specifically MOC is struggling with. moc -E shows the correct output.

      1 Reply Last reply
      0
      • M Offline
        M Offline
        mattfbacon
        wrote on last edited by
        #4

        If I can get confirmation that this is intended behavior, I will just revert to using 2 macros. I just want to make sure this isn't a bug.

        1 Reply Last reply
        0
        • Christian EhrlicherC Online
          Christian EhrlicherC Online
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #5

          As it does not work it's not implemented in moc so it's a not intended use case. If you want this feature provide a patch, maybe it gets integrated.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          M 1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by
            #6

            did you try the inline versions?

            #define SIGNAL_SLOT(NAME, ...) \
              Q_SLOT void update_ ## NAME(__VA_ARGS__); \
              Q_SIGNAL void NAME ## _changed(__VA_ARGS__)
            

            "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

            M 1 Reply Last reply
            1
            • Christian EhrlicherC Christian Ehrlicher

              As it does not work it's not implemented in moc so it's a not intended use case. If you want this feature provide a patch, maybe it gets integrated.

              M Offline
              M Offline
              mattfbacon
              wrote on last edited by
              #7

              @Christian-Ehrlicher doesn't work != not implemented. As I said before I want to make sure it's not a bug. The same code written out without macros works fine, and the macros are all expanded correctly according to moc -E.

              1 Reply Last reply
              0
              • Christian EhrlicherC Online
                Christian EhrlicherC Online
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #8

                Please show a header which does not work, without any macros so we can see what you really want and what not work.

                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                Visit the Qt Academy at https://academy.qt.io/catalog

                M 1 Reply Last reply
                0
                • VRoninV VRonin

                  did you try the inline versions?

                  #define SIGNAL_SLOT(NAME, ...) \
                    Q_SLOT void update_ ## NAME(__VA_ARGS__); \
                    Q_SIGNAL void NAME ## _changed(__VA_ARGS__)
                  
                  M Offline
                  M Offline
                  mattfbacon
                  wrote on last edited by
                  #9

                  @VRonin Yes this works!! Thank you for addressing the problem 😌 I guess I am still a bit of a Qt newbie, since I've never heard of those inline annotations, but they are super useful for macros like these!

                  1 Reply Last reply
                  0
                  • Christian EhrlicherC Christian Ehrlicher

                    Please show a header which does not work, without any macros so we can see what you really want and what not work.

                    M Offline
                    M Offline
                    mattfbacon
                    wrote on last edited by mattfbacon
                    #10

                    @Christian-Ehrlicher I believe I have found the underlying issue:

                    Expanding the macros to exactly their output:

                    class Foo : public QObject {
                      Q_OBJECT
                    // ...
                    public slots: void update_property(bool); signals: void property_changed(bool);
                    protected:
                      bool property;
                    };
                    

                    does not compile either (same linker errors with the signals). You can't have slots and signals on the same line. However, C++ is meant to be a whitespace-insensitive language, so I still think this is a bug in MOC, albeit a different one. I will change the title.

                    JKSHJ 1 Reply Last reply
                    0
                    • Christian EhrlicherC Online
                      Christian EhrlicherC Online
                      Christian Ehrlicher
                      Lifetime Qt Champion
                      wrote on last edited by
                      #11

                      Even it's a 'bug' in moc it will unlikely to be changed, and when then not before 6.3 so ... don't see why this is needed though.

                      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                      Visit the Qt Academy at https://academy.qt.io/catalog

                      M 1 Reply Last reply
                      0
                      • M mattfbacon

                        @Christian-Ehrlicher I believe I have found the underlying issue:

                        Expanding the macros to exactly their output:

                        class Foo : public QObject {
                          Q_OBJECT
                        // ...
                        public slots: void update_property(bool); signals: void property_changed(bool);
                        protected:
                          bool property;
                        };
                        

                        does not compile either (same linker errors with the signals). You can't have slots and signals on the same line. However, C++ is meant to be a whitespace-insensitive language, so I still think this is a bug in MOC, albeit a different one. I will change the title.

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

                        @mattfbacon said in MOC: signals and slots can't be on same line:

                        C++ is meant to be a whitespace-insensitive language, so I still think this is a bug in MOC

                        Yes, C++ is meant to be whitespace-insensitive. However, moc currently parses files using a custom text processor, not a full-fledged C++ engine. The processor currently doesn't support having "signals:" and "slots:" on the same line.

                        If you're interested, here's an experiment that reimplements moc on top of libclang, which gives it more capabilities in understanding arbitrary C++: https://woboq.com/blog/moc-with-clang.html

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

                        M 1 Reply Last reply
                        3
                        • JKSHJ JKSH

                          @mattfbacon said in MOC: signals and slots can't be on same line:

                          C++ is meant to be a whitespace-insensitive language, so I still think this is a bug in MOC

                          Yes, C++ is meant to be whitespace-insensitive. However, moc currently parses files using a custom text processor, not a full-fledged C++ engine. The processor currently doesn't support having "signals:" and "slots:" on the same line.

                          If you're interested, here's an experiment that reimplements moc on top of libclang, which gives it more capabilities in understanding arbitrary C++: https://woboq.com/blog/moc-with-clang.html

                          M Offline
                          M Offline
                          mattfbacon
                          wrote on last edited by
                          #13

                          @JKSH Interesting. Looks like moc-ng is fully functional; I will have to try that on my project.

                          M 1 Reply Last reply
                          0
                          • M mattfbacon

                            @JKSH Interesting. Looks like moc-ng is fully functional; I will have to try that on my project.

                            M Offline
                            M Offline
                            mattfbacon
                            wrote on last edited by
                            #14

                            @JKSH Scratch that, just realized that the project is almost two years old and won't compile. Really, moc should be using a full C++ parser...

                            JKSHJ Christian EhrlicherC 2 Replies Last reply
                            0
                            • Christian EhrlicherC Christian Ehrlicher

                              Even it's a 'bug' in moc it will unlikely to be changed, and when then not before 6.3 so ... don't see why this is needed though.

                              M Offline
                              M Offline
                              mattfbacon
                              wrote on last edited by
                              #15

                              @Christian-Ehrlicher It's not strictly needed but without it the signals: and slots: section labels don't work like others. This makes signals and slots a leaky abstraction. This is especially true when you consider that Qt 5 moc is supposed to support macros, but macros can't have newlines so they are forced to put it all on the same line. In this context, unless you want to mark everything inline with Q_SLOT and Q_SIGNAL (and $DEITY forbid your macro actually wants to change the context for code after it), you're out of luck.

                              1 Reply Last reply
                              0
                              • M mattfbacon

                                @JKSH Scratch that, just realized that the project is almost two years old and won't compile. Really, moc should be using a full C++ parser...

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

                                @mattfbacon said in MOC: signals and slots can't be on same line:

                                Really, moc should be using a full C++ parser...

                                I agree, that would be ideal.

                                However, something like libclang did not exist when moc was invented. To reimplement it now with libclang is a costly and risky exercise. Can you show that the benefits outweigh the risks?

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

                                1 Reply Last reply
                                0
                                • M mattfbacon

                                  @JKSH Scratch that, just realized that the project is almost two years old and won't compile. Really, moc should be using a full C++ parser...

                                  Christian EhrlicherC Online
                                  Christian EhrlicherC Online
                                  Christian Ehrlicher
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #17

                                  @mattfbacon said in MOC: signals and slots can't be on same line:

                                  Really, moc should be using a full C++ parser...

                                  Again: feel free to provide a patch instead blaming around that a corner case does not work...

                                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                  Visit the Qt Academy at https://academy.qt.io/catalog

                                  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