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. Use a self-made C function in QT
Forum Updated to NodeBB v4.3 + New Features

Use a self-made C function in QT

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 6 Posters 2.7k Views 4 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.
  • E Offline
    E Offline
    EL_Mambo
    wrote on last edited by
    #1

    Hello ! I'm currently doing a menu for a raytracer. My raytracer have features that change colors and effect, i want to add buttons on my menu that apply the effect directly !

    Let's use for example the effect black and white, i got my fonction declared like this : b_and_w(t_env *e)
    t_env is just a simple struct containing few variables.

    After few researches i found out i got to use extern "C" {}, so i declared my function in qt like this :

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    ...
    INCLUDES
    ...
    void    b_and_w(t_env *e)
    {
        ...
        MYCODE
        ...
    }
    
    #ifdef __cplusplus
    }
    #endif
    

    Qt seems fine with it, but now i want to call it when button is clicked so i did this :

    QObject::connect(b_effect, SIGNAL(clicked()), this, SLOT(b_and_w(e)));
    

    Of course, as i expected, Qt doesn't know what "e" is... So here i am, totally stuck, not managing to call my function when needed :/

    K 1 Reply Last reply
    0
    • E EL_Mambo

      Hello ! I'm currently doing a menu for a raytracer. My raytracer have features that change colors and effect, i want to add buttons on my menu that apply the effect directly !

      Let's use for example the effect black and white, i got my fonction declared like this : b_and_w(t_env *e)
      t_env is just a simple struct containing few variables.

      After few researches i found out i got to use extern "C" {}, so i declared my function in qt like this :

      #ifdef __cplusplus
      extern "C" {
      #endif
      
      ...
      INCLUDES
      ...
      void    b_and_w(t_env *e)
      {
          ...
          MYCODE
          ...
      }
      
      #ifdef __cplusplus
      }
      #endif
      

      Qt seems fine with it, but now i want to call it when button is clicked so i did this :

      QObject::connect(b_effect, SIGNAL(clicked()), this, SLOT(b_and_w(e)));
      

      Of course, as i expected, Qt doesn't know what "e" is... So here i am, totally stuck, not managing to call my function when needed :/

      K Offline
      K Offline
      koahnig
      wrote on last edited by
      #2

      @EL_Mambo

      You cannot use simple C functions as slots for signals. You need to have a class derived from QObject which holds also the Q_OBJECT macro. Please have a look to signals and slots.

      Also it is always a good choice to familiarize with some of the examples. Sometimes you find one which resembles closely what you like to achieve. So you might have a good jumpstart and you can divert from there.

      If you like to use Qt C is not sufficient enough and you have to understand some of the basics of C++.

      Vote the answer(s) that helped you to solve your issue(s)

      kshegunovK 1 Reply Last reply
      2
      • K koahnig

        @EL_Mambo

        You cannot use simple C functions as slots for signals. You need to have a class derived from QObject which holds also the Q_OBJECT macro. Please have a look to signals and slots.

        Also it is always a good choice to familiarize with some of the examples. Sometimes you find one which resembles closely what you like to achieve. So you might have a good jumpstart and you can divert from there.

        If you like to use Qt C is not sufficient enough and you have to understand some of the basics of C++.

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

        @koahnig said in Use a self-made C function in QT:

        You cannot use simple C functions as slots for signals.

        Sure you can, example:

        void aboutToQuitHandler()
        {
        }
        
        int main(int argc, char *argv[])
        {
            QCoreApplication app(argc, argv);
          
            QObject::connect(&app, &QCoreApplication::aboutToQuit, aboutToQuitHandler);
            QTimer::singleShot(0, &app, &QCoreApplication::quit);
        
            return app.exec();
        }
        

        Lambdas are (almost) quite the same as a plain C functions.

        @EL_Mambo said in Use a self-made C function in QT:

        Of course, as i expected, Qt doesn't know what "e" is... So here i am, totally stuck, not managing to call my function when needed :/

        Use the Qt 5 connection syntax and std::bind to bind the local variable as an argument to the slot. Also is there a specific reason to use extern "C"? If not then you should just remove it.

        Read and abide by the Qt Code of Conduct

        aha_1980A K 2 Replies Last reply
        4
        • kshegunovK kshegunov

          @koahnig said in Use a self-made C function in QT:

          You cannot use simple C functions as slots for signals.

          Sure you can, example:

          void aboutToQuitHandler()
          {
          }
          
          int main(int argc, char *argv[])
          {
              QCoreApplication app(argc, argv);
            
              QObject::connect(&app, &QCoreApplication::aboutToQuit, aboutToQuitHandler);
              QTimer::singleShot(0, &app, &QCoreApplication::quit);
          
              return app.exec();
          }
          

          Lambdas are (almost) quite the same as a plain C functions.

          @EL_Mambo said in Use a self-made C function in QT:

          Of course, as i expected, Qt doesn't know what "e" is... So here i am, totally stuck, not managing to call my function when needed :/

          Use the Qt 5 connection syntax and std::bind to bind the local variable as an argument to the slot. Also is there a specific reason to use extern "C"? If not then you should just remove it.

          aha_1980A Offline
          aha_1980A Offline
          aha_1980
          Lifetime Qt Champion
          wrote on last edited by aha_1980
          #4

          @kshegunov

          Also is there a specific reason to use extern "C"? If not then you should just remove it.

          If the function is implemented in a C file, then yes. Reason is the C++ compiler name mangling.

          so extern C should stay.

          Qt has to stay free or it will die.

          kshegunovK 1 Reply Last reply
          0
          • aha_1980A aha_1980

            @kshegunov

            Also is there a specific reason to use extern "C"? If not then you should just remove it.

            If the function is implemented in a C file, then yes. Reason is the C++ compiler name mangling.

            so extern C should stay.

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

            @aha_1980 said in Use a self-made C function in QT:

            Reason is the C++ compiler name mangling.

            Which would be irrelevant if you don't intend to export the symbols with undecorated ABI, which is the "specific reason" I was asking about. (note that the linkage specifier is around the actual definition)

            Read and abide by the Qt Code of Conduct

            1 Reply Last reply
            0
            • Pablo J. RoginaP Offline
              Pablo J. RoginaP Offline
              Pablo J. Rogina
              wrote on last edited by
              #6

              @EL_Mambo I was able to call a function contained in a .c file directly from the signal of a Qt widget using the new syntax of connecting signal to simple functions

              function.h

              #ifndef FUNCTION_H
              #define FUNCTION_H
              
              void b_and_w();
              
              #endif // FUNCTION_H
              

              function.c

              #include "function.h"
              #include <stdio.h>
              
              void b_and_w()
              {
                  fprintf(stderr, "C function called\n");
              }
              

              In mainwindow.cpp (MainWindow just contains a QPushButton called btnCallC)

              ...
              #ifdef __cplusplus
              extern "C" {
              #endif
              
              #include "function.h"
              
              #ifdef __cplusplus
              }
              #endif
              ...
              MainWindow::MainWindow(QWidget *parent) :
                  QMainWindow(parent),
                  ui(new Ui::MainWindow)
              {
                  ui->setupUi(this);
                  connect(ui->btnCallC, &QPushButton::clicked, b_and_w);
              }
              

              you may need to play a little bit to pass the struct you mentioned before. See @kshegunov suggestion about using std:bind

              Upvote the answer(s) that helped you solve the issue
              Use "Topic Tools" button to mark your post as Solved
              Add screenshots via postimage.org
              Don't ask support requests via chat/PM. Please use the forum so others can benefit from the solution in the future

              1 Reply Last reply
              1
              • kshegunovK kshegunov

                @koahnig said in Use a self-made C function in QT:

                You cannot use simple C functions as slots for signals.

                Sure you can, example:

                void aboutToQuitHandler()
                {
                }
                
                int main(int argc, char *argv[])
                {
                    QCoreApplication app(argc, argv);
                  
                    QObject::connect(&app, &QCoreApplication::aboutToQuit, aboutToQuitHandler);
                    QTimer::singleShot(0, &app, &QCoreApplication::quit);
                
                    return app.exec();
                }
                

                Lambdas are (almost) quite the same as a plain C functions.

                @EL_Mambo said in Use a self-made C function in QT:

                Of course, as i expected, Qt doesn't know what "e" is... So here i am, totally stuck, not managing to call my function when needed :/

                Use the Qt 5 connection syntax and std::bind to bind the local variable as an argument to the slot. Also is there a specific reason to use extern "C"? If not then you should just remove it.

                K Offline
                K Offline
                koahnig
                wrote on last edited by
                #7

                @kshegunov said in Use a self-made C function in QT:

                @koahnig said in Use a self-made C function in QT:

                You cannot use simple C functions as slots for signals.

                Sure you can, example:

                void aboutToQuitHandler()
                {
                }
                
                int main(int argc, char *argv[])
                {
                    QCoreApplication app(argc, argv);
                  
                    QObject::connect(&app, &QCoreApplication::aboutToQuit, aboutToQuitHandler);
                    QTimer::singleShot(0, &app, &QCoreApplication::quit);
                
                    return app.exec();
                }
                

                Lambdas are (almost) quite the same as a plain C functions.

                Oops, I admit that I was wrong here.

                Anyway you are using a functor here.

                Am I correct that you require the functor-type and cannot use the macro style as at top of post?

                Vote the answer(s) that helped you to solve your issue(s)

                kshegunovK 1 Reply Last reply
                0
                • Pablo J. RoginaP Offline
                  Pablo J. RoginaP Offline
                  Pablo J. Rogina
                  wrote on last edited by
                  #8

                  @koahnig said in Use a self-made C function in QT:

                  Am I correct that you require the functor-type and cannot use the macro style as at top of post?

                  Yes, you're right in that case and that's one of the benefits of the new syntax for signals & slots.

                  Upvote the answer(s) that helped you solve the issue
                  Use "Topic Tools" button to mark your post as Solved
                  Add screenshots via postimage.org
                  Don't ask support requests via chat/PM. Please use the forum so others can benefit from the solution in the future

                  K 1 Reply Last reply
                  0
                  • K koahnig

                    @kshegunov said in Use a self-made C function in QT:

                    @koahnig said in Use a self-made C function in QT:

                    You cannot use simple C functions as slots for signals.

                    Sure you can, example:

                    void aboutToQuitHandler()
                    {
                    }
                    
                    int main(int argc, char *argv[])
                    {
                        QCoreApplication app(argc, argv);
                      
                        QObject::connect(&app, &QCoreApplication::aboutToQuit, aboutToQuitHandler);
                        QTimer::singleShot(0, &app, &QCoreApplication::quit);
                    
                        return app.exec();
                    }
                    

                    Lambdas are (almost) quite the same as a plain C functions.

                    Oops, I admit that I was wrong here.

                    Anyway you are using a functor here.

                    Am I correct that you require the functor-type and cannot use the macro style as at top of post?

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

                    @koahnig said in Use a self-made C function in QT:

                    Anyway you are using a functor here.

                    A functor is a function with an object attached, so if you don't have data it is simply a function. :)

                    Am I correct that you require the functor-type and cannot use the macro style as at top of post?

                    Yes, Qt wraps the pointer you pass it in a special object (using some template black magic to get the arguments right) that it uses to actually execute it when needed. This will not work with the Qt4 syntax, as there the resolution is done in runtime through the meta-object system.

                    Read and abide by the Qt Code of Conduct

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      Hi,

                      In addition to what my fellow wrote: you can't connect a signal with fewer parameters than the slot you want to call unless it has default arguments. It's also not possible with the new syntax but you can use a lambda as an alternative.

                      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
                      1
                      • Pablo J. RoginaP Pablo J. Rogina

                        @koahnig said in Use a self-made C function in QT:

                        Am I correct that you require the functor-type and cannot use the macro style as at top of post?

                        Yes, you're right in that case and that's one of the benefits of the new syntax for signals & slots.

                        K Offline
                        K Offline
                        koahnig
                        wrote on last edited by
                        #11

                        @Pablo-J.-Rogina @kshegunov @SGaist

                        Well, at least I can use as excuse that I learnd signal-slot functionality way back with Qt 4.3 (probably?) and there was only the macro version possible. And apparently, I shall give up my stubbornness and finally stash or trash my Qt 5.4 version, which is still a bit restricted with functor-based syntax on connect. ;)

                        Vote the answer(s) that helped you to solve your issue(s)

                        1 Reply Last reply
                        1
                        • E Offline
                          E Offline
                          EL_Mambo
                          wrote on last edited by
                          #12

                          Thanks everyone for your answers ! I should be able to do what i want with all the ressources you gave me :)

                          1 Reply Last reply
                          2

                          • Login

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