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.5k 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.
  • 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