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. QLCDnumber, slots, and my own complete loss of mental function...
Qt 6.11 is out! See what's new in the release blog

QLCDnumber, slots, and my own complete loss of mental function...

Scheduled Pinned Locked Moved Unsolved General and Desktop
29 Posts 3 Posters 12.3k Views 1 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.
  • mrjjM mrjj

    Hi
    it looks pretty close but hard to say without the actual error and line number :)
    Let me know if you need a sample of talking to an LCD from other class.
    The basic version is not that complicated, but can be hard the first times.

    A Offline
    A Offline
    Aesgarth
    wrote on last edited by
    #17

    @mrjj

    yes please, i'll have a look at a sample and see if i can work it out.

    mrjjM 1 Reply Last reply
    0
    • A Aesgarth

      @mrjj

      yes please, i'll have a look at a sample and see if i can work it out.

      mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by mrjj
      #18

      @Aesgarth
      Hi
      Here is a very basic sample.
      I has LCD in mainwindow and pops a dialog where u can enter number to have it display that.
      It as basic as it can get as i try to have as little code as possible to focus on the signal and slot thing.

      alt text

      Test Project
      https://www.dropbox.com/s/u94zqx9v9c8xfdf/LCDOtherClass.zip?dl=0

      (sorry its c++. I wish i could do python :)

      Even its a MainWindow, the concept is 100% the same.
      So slot in class that has LCD and signal in controller.

      A 1 Reply Last reply
      3
      • mrjjM mrjj

        @Aesgarth
        Hi
        Here is a very basic sample.
        I has LCD in mainwindow and pops a dialog where u can enter number to have it display that.
        It as basic as it can get as i try to have as little code as possible to focus on the signal and slot thing.

        alt text

        Test Project
        https://www.dropbox.com/s/u94zqx9v9c8xfdf/LCDOtherClass.zip?dl=0

        (sorry its c++. I wish i could do python :)

        Even its a MainWindow, the concept is 100% the same.
        So slot in class that has LCD and signal in controller.

        A Offline
        A Offline
        Aesgarth
        wrote on last edited by Aesgarth
        #19

        @mrjj
        Excellent, that helps... I think i understand what's going on there...
        however.... this bit...

        void MainWindow::on_pushButton_released()
        {
            Dialog dia;
            connect( &dia, &Dialog::SetLCD, this, &MainWindow::SetLCD  );
            dia.exec();
        }
        

        i'm not sure where to put it in my version.

        relaycontroller.h is where pretty much everything happens - switching of things and the counter...

        #ifndef RELAYCONTROLLER_H
        #define RELAYCONTROLLER_H
        
        #include <QObject>
        #include <QTimer>
        #include <wiringPi.h>
        #include <QDebug>
        
        class RelayController : public QObject
        {
            Q_OBJECT
        public:
            explicit RelayController(int pin, int delay, QObject *parent = 0):QObject(parent){
                timer = new QTimer(this);
                state = false;
                timer->setInterval(delay);
                mPin = pin;
                //old style
                connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
                //new style
                //connect(timer, &QTimer::timeout, this, &RelayController::onTimeout);
                pinMode (mPin, OUTPUT);
                relayLow();
            }
            void start(){
                qDebug()<<"start";
                timer->start();
        		//zero counter
        		cntState = 0;
        		//send to LCD
                emit setLCD(0);
            }
            void stop(){
                qDebug()<<"stop";
                timer->stop();
            }
        
            void relayLow(){
                digitalWrite (mPin, LOW);
                qDebug()<<"low";
            }
            void relayHigh(){
                //code here: relay on
                digitalWrite(mPin, HIGH);
                qDebug()<<"high";
            }
        signals:
            void setLCD(int number);
        	
        private slots:
            void onTimeout(){
                if(state){
                    relayHigh();
        			//increment counter
        			cntState++;
        			//send to LCD
                    emit setLCD(cntState);
        			qDebug()<<cntState;
                }
                else
                    relayLow();
                state = !state;
            }
        private:
            QTimer *timer;
            bool state;
            int mPin;
        	int cntState;
        };
        
        
        #endif // RELAYCONTROLLER_H
        
        

        and RelayFrame is where the LCD is...

        #include "relayframe.h"
        #include "ui_relayframe.h"
        
        #include <QPushButton>
        
        
        //relayframe is a box with buttons and an LCD widget in it,
        //created for each individual output pin. relayframe.ui is an XML
        //file determining layout, code is in relayframe.h
        RelayFrame::RelayFrame(int pin, QWidget *parent) :
            QFrame(parent),
            ui(new Ui::RelayFrame)
        {
            ui->setupUi(this);
            //power cycle controller, 750ms delay
            controller = new RelayController(pin, 750);
            //heat cycle controller, 2 hour (5400000ms) delay
            controller2 = new RelayController(pin,5400000);
        }
        
        RelayFrame::~RelayFrame()
        {
            delete ui;
        }
        // Power cycle button button
        // While clicked controller initialised above, found in relaycontroller.h
        // runs, when unchecked it stops (only one button per frame can be clicked
        // at once, buttons auto toggle on)
        void RelayFrame::on_powerBrtn_toggled(bool checked)
        {
            if(checked)
                controller->start();
            else controller->stop();
        }
        // On button - turns on the pin relevant to this frame
        void RelayFrame::on_onBtn_clicked()
        {
            controller->relayHigh();
            //Set LCD to 1 while on...
            ui->lcdNumber->display(1);
        }
        // Off button - turns off the pin relevant to this frame
        void RelayFrame::on_offBtn_clicked()
        {
            controller->relayLow();
        	ui->lcdNumber->display(0);
        }
        // Heat cycle button
        // While clicked controller2 initialised above, found in relaycontroller.h
        // runs, when unchecked it stops (only one button per frame can be clicked
        // at once, buttons auto toggle on.
        void RelayFrame::on_heatBtn_toggled(bool checked)
        {
            if(checked)
                controller2->start();
            else controller2->stop();
        }
        //
        void RelayFrame::SetLCD(int value) 
        {
          ui->lcdNumber->display( QString::number(value)  );
        }
        

        This compiles and runs - but obviously as setLCD in the 2 places are not connected as yet the LCD number doesn't update...

        Edit: there's something odd going on with the indentation when i copy and paste - but it looks ok before i do that, and seems to work. The last few lines of RelayFrame are where the relevant code is...

        1 Reply Last reply
        0
        • mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by mrjj
          #20

          Hi

          the Dialog is the controller and
          mainwindow is relayframe

          RelayFrame::RelayFrame(int pin, QWidget *parent) :
              QFrame(parent),
              ui(new Ui::RelayFrame)
          {
              ui->setupUi(this);
          
              controller = new RelayController(pin, 750);
          // connect here !
          
              controller2 = new RelayController(pin,5400000);
          // and HERE too
          
          }
          
          A 1 Reply Last reply
          0
          • mrjjM mrjj

            Hi

            the Dialog is the controller and
            mainwindow is relayframe

            RelayFrame::RelayFrame(int pin, QWidget *parent) :
                QFrame(parent),
                ui(new Ui::RelayFrame)
            {
                ui->setupUi(this);
            
                controller = new RelayController(pin, 750);
            // connect here !
            
                controller2 = new RelayController(pin,5400000);
            // and HERE too
            
            }
            
            A Offline
            A Offline
            Aesgarth
            wrote on last edited by
            #21

            @mrjj

            OK, so i've probably done this wrong, but i have the following errors:

            /home/pi/LampTesterV2/relayframe.cpp:17: error: ‘void RelayController::SetLCD(int)’ is protected within this context
              connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                                        ^~~~~~
            
            /home/pi/LampTesterV2/relayframe.cpp:17: error: no matching function for call to ‘RelayFrame::connect(void (RelayController::*)(int), RelayFrame*, void (RelayFrame::*)(int))’
              connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                                                                           ^
            

            in this bit...

            RelayFrame::RelayFrame(int pin, QWidget *parent) :
                QFrame(parent),
                ui(new Ui::RelayFrame)
            {
                ui->setupUi(this);
                //power cycle controller, 750ms delay
                controller = new RelayController(pin, 750);
            	connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                //heat cycle controller, 2 hour (5400000ms) delay
                controller2 = new RelayController(pin,5400000);
            	connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
            }
            
            

            which doesn't look right to me anyway as i have the exact same thing twice...

            mrjjM 1 Reply Last reply
            0
            • A Aesgarth

              @mrjj

              OK, so i've probably done this wrong, but i have the following errors:

              /home/pi/LampTesterV2/relayframe.cpp:17: error: ‘void RelayController::SetLCD(int)’ is protected within this context
                connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                                          ^~~~~~
              
              /home/pi/LampTesterV2/relayframe.cpp:17: error: no matching function for call to ‘RelayFrame::connect(void (RelayController::*)(int), RelayFrame*, void (RelayFrame::*)(int))’
                connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                                                                             ^
              

              in this bit...

              RelayFrame::RelayFrame(int pin, QWidget *parent) :
                  QFrame(parent),
                  ui(new Ui::RelayFrame)
              {
                  ui->setupUi(this);
                  //power cycle controller, 750ms delay
                  controller = new RelayController(pin, 750);
              	connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                  //heat cycle controller, 2 hour (5400000ms) delay
                  controller2 = new RelayController(pin,5400000);
              	connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
              }
              
              

              which doesn't look right to me anyway as i have the exact same thing twice...

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #22

              @Aesgarth

              ahh c+11

              change
              signals:
              to public signals:

              i think

              A 1 Reply Last reply
              0
              • mrjjM mrjj

                @Aesgarth

                ahh c+11

                change
                signals:
                to public signals:

                i think

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

                @mrjj

                That considerably reduced the error count, however....

                /usr/include/qt4/QtCore/qobjectdefs.h:69: error: expected ‘:’ before ‘protected’
                 #   define signals protected
                                    ^
                
                /home/pi/LampTesterV2/relaycontroller.h:47: in expansion of macro ‘signals’
                 public signals:
                        ^~~~~~~
                

                Edited to include the next line.

                mrjjM 1 Reply Last reply
                0
                • A Aesgarth

                  @mrjj

                  That considerably reduced the error count, however....

                  /usr/include/qt4/QtCore/qobjectdefs.h:69: error: expected ‘:’ before ‘protected’
                   #   define signals protected
                                      ^
                  
                  /home/pi/LampTesterV2/relaycontroller.h:47: in expansion of macro ‘signals’
                   public signals:
                          ^~~~~~~
                  

                  Edited to include the next line.

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #24

                  @Aesgarth

                  please look at sample. should be the same.

                  A 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    @Aesgarth

                    please look at sample. should be the same.

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

                    @mrjj

                    I think the problem is with how i'm trying to connect the 2 - since using public signals: i get the same error with the connect lines commented out, but just using signals: (as per the example) works until i try to connect the signal and slot...

                    does this look right?
                    connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD);

                    A 1 Reply Last reply
                    0
                    • A Aesgarth

                      @mrjj

                      I think the problem is with how i'm trying to connect the 2 - since using public signals: i get the same error with the connect lines commented out, but just using signals: (as per the example) works until i try to connect the signal and slot...

                      does this look right?
                      connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD);

                      A Offline
                      A Offline
                      Aesgarth
                      wrote on last edited by
                      #26

                      OK... i'm totally convinced the above is not right as i should be trying to connect the signal from controller or controller2 to the slot in RelayFrame, rather than the signal from RelayController...

                      mrjjM 1 Reply Last reply
                      0
                      • A Aesgarth

                        OK... i'm totally convinced the above is not right as i should be trying to connect the signal from controller or controller2 to the slot in RelayFrame, rather than the signal from RelayController...

                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by
                        #27

                        @Aesgarth
                        you miss the first part
                        connect(controller, &RelayController::SetLCD, this, &RelayFrame::SetLCD);
                        and
                        connect(controller2, &RelayController::SetLCD, this, &RelayFrame::SetLCD);

                        the syntax is

                        connect ( pointer to object, function address , pointer to object, function address )

                        (unless you are using lambdas)

                        1 Reply Last reply
                        0
                        • A Offline
                          A Offline
                          Aesgarth
                          wrote on last edited by
                          #28

                          Thanks, that looks better but i'm back to

                          /home/pi/LampTesterV2/relayframe.cpp:17: error: ‘void RelayController::SetLCD(int)’ is protected within this context
                            connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                                                      ^~~~~~
                          
                          /home/pi/LampTesterV2/relayframe.cpp:17: error: no matching function for call to ‘RelayFrame::connect(void (RelayController::*)(int), RelayFrame*, void (RelayFrame::*)(int))’
                            connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                                                                                         ^
                          

                          And i only have access to the device for the next hour, so... I think i'll have a bit of a practice at home over Christmas and see if i can improve any, and come back to this next year. Thanks for all the help @mrjj and @J.Hilk

                          mrjjM 1 Reply Last reply
                          0
                          • A Aesgarth

                            Thanks, that looks better but i'm back to

                            /home/pi/LampTesterV2/relayframe.cpp:17: error: ‘void RelayController::SetLCD(int)’ is protected within this context
                              connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                                                        ^~~~~~
                            
                            /home/pi/LampTesterV2/relayframe.cpp:17: error: no matching function for call to ‘RelayFrame::connect(void (RelayController::*)(int), RelayFrame*, void (RelayFrame::*)(int))’
                              connect(&RelayController::SetLCD, this, &RelayFrame::SetLCD  );
                                                                                           ^
                            

                            And i only have access to the device for the next hour, so... I think i'll have a bit of a practice at home over Christmas and see if i can improve any, and come back to this next year. Thanks for all the help @mrjj and @J.Hilk

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by
                            #29

                            Hi
                            i think it says your RelayController::SetLCD is PROTECTED and not public.
                            Since you are in another class, you cant use a protected member.

                            Ok. we nail it in 2018 ;)

                            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