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. Signal and slot problem
Forum Updated to NodeBB v4.3 + New Features

Signal and slot problem

Scheduled Pinned Locked Moved Solved General and Desktop
30 Posts 4 Posters 13.3k 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.
  • A azravian

    @SGaist thank you for it :) and the point od making these methods statics is that i am using wiringPi library which need a function as a parameter so i need make it static.

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #20

    @azravian In this case you could add a public static method to get the pointer to the gpio instance (basically you create a singleton):

    class gpio : public QObject
    {
        Q_OBJECT
    public:
        gpio(): instancePtr(nullptr) {}
        static gpio* instance()
        {
            if (!instancePtr) instancePtr = new gpio();
            return instancePtr;
        }
    private:
        gpio* instancePtr;
    

    You can use this method in main to setup the connection and in static methods in gpio to get the pointer to the instance. Don't forget to delete the instance later.

    https://forum.qt.io/topic/113070/qt-code-of-conduct

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

      @jsulm you forgot to also make instancePtr static. However, I don't think the singleton pattern should be applied here.

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

      jsulmJ 1 Reply Last reply
      0
      • SGaistS SGaist

        @jsulm you forgot to also make instancePtr static. However, I don't think the singleton pattern should be applied here.

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #22

        @SGaist Yes, I forgot, thanks for pointing :-)

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • mrjjM mrjj

          @SGaist
          Thank champ. In the static heat, i completely missed that.

          @azravian
          You should have a
          delete GPIO in the end of the function or even better
          just go back to using the stack again. (so it cleans it self)
          void gpio::ISR()
          {
          gpio GPIO;

          A Offline
          A Offline
          azravian
          wrote on last edited by
          #23

          @mrjj @SGaist
          Now it's all working now but i cannot use ui memeber like label, lineEdit etc. For example

          void MainWindow::inserted()
          {
              qDebug()<<"Inserted...";
              ui->label->setText("Inserted");
          }
          

          i do get "Inserted..." but the label does not change Text :(

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

            Silly question but are you user the label is visible ? Do you have something on it before you call inserted ?

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

            A 1 Reply Last reply
            0
            • SGaistS SGaist

              Silly question but are you user the label is visible ? Do you have something on it before you call inserted ?

              A Offline
              A Offline
              azravian
              wrote on last edited by
              #25

              @SGaist yes for instance it has the default text "textLabel" and that's visible on GUI

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

                Then do you have something else that modifies that label ?

                Things would be a bit easier if there was a possibility to see your code.

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

                A 1 Reply Last reply
                0
                • SGaistS SGaist

                  Then do you have something else that modifies that label ?

                  Things would be a bit easier if there was a possibility to see your code.

                  A Offline
                  A Offline
                  azravian
                  wrote on last edited by
                  #27

                  @SGaist
                  Sure Sir, it's the same code except i added just one line

                  #include "mainwindow.h"
                  #include "ui_mainwindow.h"
                  #include "gpio.h"
                  #include <QDebug>
                  
                  bool firstTime=true;
                  MainWindow::MainWindow(QWidget *parent) :
                      QMainWindow(parent),
                      ui(new Ui::MainWindow)
                  {
                      if(firstTime)
                      {
                          gpio::Initialize();
                          firstTime=false;
                      }
                      gpio* GPIO=new gpio;
                      connect(GPIO,SIGNAL(RisingEdge()),this,SLOT(inserted()));
                      connect(GPIO,SIGNAL(FallingEdge()),this,SLOT(Removed()));
                      delete GPIO;
                      ui->setupUi(this);
                  }
                  
                  MainWindow::~MainWindow()
                  {
                      delete ui;
                  }
                  void MainWindow::inserted()
                  {
                      qDebug()<<"Inserted...";
                      ui->label->setText("Inserted");
                  }
                  
                  void MainWindow::Removed()
                  {
                      ui->label->setText("Inserted");
                      qDebug()<<"Removed...";
                  }
                  
                  
                  
                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #28

                    If I may, you really should first cleanup your gpio class. It looks wrongly implemented and is wrongly used.

                    Make it a normal object i.e. don't use any static in it and don't make it a singleton. Once you have that sorted, it will be easier to integrate it in your GUI.

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

                    A 1 Reply Last reply
                    0
                    • SGaistS SGaist

                      If I may, you really should first cleanup your gpio class. It looks wrongly implemented and is wrongly used.

                      Make it a normal object i.e. don't use any static in it and don't make it a singleton. Once you have that sorted, it will be easier to integrate it in your GUI.

                      A Offline
                      A Offline
                      azravian
                      wrote on last edited by azravian
                      #29

                      @SGaist
                      if i don't use ISR() and Initialize() as static i get error with wiringPiISR()
                      as
                      wiringPiISR (BUTTON, INT_EDGE_BOTH,&ISR);
                      it gives an error
                      error: cannot convert 'void (gpio::)()' to 'void ()()' for argument '3' to 'int wiringPiISR(int, int, void (*)())'
                      wiringPiISR (BUTTON, INT_EDGE_BOTH,&ISR);
                      ^

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

                        Ok, and there's no way to pass any parameter so here is an implementation example using a singleton:
                        WARNING : not tested on a Pi.

                        rpigpio.h

                        #ifndef RPIGPIO_H
                        #define RPIGPIO_H
                        
                        #include <QObject>
                        
                        class RpiGPIO : public QObject
                        {
                            Q_OBJECT
                        
                        public:
                            static RpiGPIO *instance();
                            static void destroy();
                        
                            static void initialize(int buttonNumber);
                        
                        signals:
                            void edgeRaised();
                            void edgeFalled();
                        
                        private:
                            RpiGPIO();
                        
                            static void raisingEdgeCallback();
                            static void fallingEdgeCallback();
                        
                            void onRaisingEdge();
                            void onFallingEdge();
                        
                        private:
                            static RpiGPIO *_gpio;
                        };
                        
                        #endif
                        

                        rpigpio.cpp

                        
                        #include "gpio.h"
                        
                        RpiGPIO *RpiGPIO::_gpio = nullptr;
                        
                        RpiGPIO::RpiGPIO()
                           : QObject(nullptr)
                        {}
                        
                        RpiGPIO *RpiGPIO::instance()
                        {
                            if (!_gpio) {
                                _gpio = new RpiGPIO;
                            }
                        
                            return _gpio;
                        }
                        
                        void RpiGPIO::destroy()
                        {
                            delete _gpio;
                        }
                        
                        void RpiGPIO::initialize(int buttonNumber)
                        {
                            wiringPiISR(buttonNumber, INT_EDGE_RAISING, RpiGPIO::raisingEdgeCallback);
                            wiringPiISR(buttonNumber, INT_EDGE_FALLING, RpiGPIO::fallingEdgeCallback);
                        }
                        
                        void RpiGPIO::raisingEdgeCallback()
                        {
                            RpiGPIO::instance()->onRaisingEdge();
                        }
                        
                        void RpiGPIO::fallingEdgeCallback()
                        {
                            RpiGPIO::instance()->onFallingEdge();
                        }
                        
                        void RpiGPIO::onRaisingEdge()
                        {
                            emit edgeRaised();
                        }
                        
                        void RpiGPIO::onFallingEdge()
                        {
                            emit edgeFalled();
                        }
                        

                        Then you can do in your MainWindow:

                        MainWindow::MainWindow(QWidget *parent)
                            : QMainWindow(parent)
                        {
                            RpiGPIO::initialize(numberOfTheButtonYouWantToMonitor);
                            connect(RpiGPIO::instance(), &RpiGPIO::edgeRaised, [](){ qDebug("raising");});
                            connect(RpiGPIO::instance(), &RpiGPIO::edgeFalled, [](){ qDebug("falling");});
                        }
                        
                        MainWindow::~MainWindow()
                        {
                            RpiGPIO::destroy();
                        }
                        

                        If you want to be even cleaner, move the calls to initialize and destroy in your main.cpp:

                        int main(int argc, char *argv[])
                        {
                            QApplication app(argc, argv);
                            RpiGPIO::initialize(buttonYouWantToMonitor);
                            MainWindow mw;
                            mw.show();
                            int ret = app.exec();
                            RpiGPIO::destroy();
                            return ret;
                        }
                        

                        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

                        • Login

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