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. Need help passing a variable to another Form (Signals/Slots)
Forum Updated to NodeBB v4.3 + New Features

Need help passing a variable to another Form (Signals/Slots)

Scheduled Pinned Locked Moved Solved General and Desktop
25 Posts 5 Posters 4.8k 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.
  • ? A Former User

    @jsulm I have found a little mistake. I accidentally assigned the emit call to the signal instead of the slot. After correcting this I tried connecting 2 instances of my class Option inside the MainWindow class which worked (I think). I still can't see an instance of Option outside the MainWindow class.

    functions.h

    #include <QtSql>
    #include <QSqlDatabase>
    #include <QTableView>
    
    class Option: public QObject
    {
        Q_OBJECT
    private:
        QSqlDatabase db;
        int mode;
    
    public:
        QSqlDatabase get_db(){return this->db;}
        int get_mode(){return this->mode;}
    
    signals:
        void send_option(QSqlDatabase db, int mode);
    
    public slots:
        void set_up(QSqlDatabase db, int mode){ this->db = db; this->mode = mode; emit send_option(db, mode);}
    };
    

    mainwindow.h

    //...
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private slots:
        void on_pushButton_connect_clicked();
        void on_pushButton_create_pdf_clicked();
        void on_pushButton_save_settings_clicked();
        void on_pushButton_open_clicked();
    
    private:
        Ui::MainWindow *ui;
        int create_pdf();
        Dialog dialog;
        QSqlDatabase db;
        Option opt_main, testopt; //testopt was the test-instance i used
    };
    

    mainwindow.cpp

    //...
    QObject::connect(&opt_main, &Option::send_option, &opt_dia, &Option::set_up); //opt_dia not declared in this scope
    //...
    void MainWindow::on_pushButton_open_clicked()
    {
        opt_main.send_option(db, 123);
        dialog.setModal(true);
        dialog.exec();
    }
    

    dialog.h

    //...
    #include "functions.h"
    
    namespace Ui {
    class Dialog;
    }
    
    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog(QWidget *parent = nullptr);
        //QObject* x;
        Option opt_dia;
        ~Dialog();
    
    private:
        Ui::Dialog *ui;
        void load_meta();
        int mode;
    
    private slots:
        void on_pushButton_ok_clicked();
    };
    

    dialog.cpp

    //...
    void Dialog::on_pushButton_ok_clicked()
    {
        qDebug() << "mode: " + QString::number(opt_dia.get_mode()) + " - " + opt_dia.get_db().userName(); //testing the result
    }
    

    opt_dia cannot be found since it's not declared in this scope. If I use &Dialog::opt_dia it is found but the connection will fail to compile with the following error: Fehler: no matching member function for call to 'connect'

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

    @SnuggleKat Why don't you simply define the slot inside Dialog class?
    Exposing a member (opt_dia) as public to outside world is bad design.

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

    ? 1 Reply Last reply
    1
    • jsulmJ jsulm

      @SnuggleKat Why don't you simply define the slot inside Dialog class?
      Exposing a member (opt_dia) as public to outside world is bad design.

      ? Offline
      ? Offline
      A Former User
      wrote on last edited by A Former User
      #14

      @jsulm said in Need help passing a variable to another Form (Signals/Slots):

      @SnuggleKat Why don't you simply define the slot inside Dialog class?
      Exposing a member (opt_dia) as public to outside world is bad design.

      I'm aware it's bad design. That's why I asked what'd be the best way to instantiate it.
      Is it the right way to access the signal through opt_dia if I define the slot inside the Dialog class?
      And what should the connect() look like now?

      jsulmJ 1 Reply Last reply
      0
      • ? A Former User

        @jsulm said in Need help passing a variable to another Form (Signals/Slots):

        @SnuggleKat Why don't you simply define the slot inside Dialog class?
        Exposing a member (opt_dia) as public to outside world is bad design.

        I'm aware it's bad design. That's why I asked what'd be the best way to instantiate it.
        Is it the right way to access the signal through opt_dia if I define the slot inside the Dialog class?
        And what should the connect() look like now?

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

        @SnuggleKat said in Need help passing a variable to another Form (Signals/Slots):

        When I define the slot inside the Dialog class is it the right way to access the signal through opt_dia?

        I don't understand this - what signal do you want to access from opt_dia?
        Connect would be:

        connect(&opt_main, &Option::send_option, &dialog, &Dialog::set_up);
        

        Actually I don't see a need for signal/slot here as dialog is a member of MainWindow. set_up can be a normal method which you call like any other without emiting a signal:

        dialog.set_up(...);
        

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

        ? 1 Reply Last reply
        0
        • jsulmJ jsulm

          @SnuggleKat said in Need help passing a variable to another Form (Signals/Slots):

          When I define the slot inside the Dialog class is it the right way to access the signal through opt_dia?

          I don't understand this - what signal do you want to access from opt_dia?
          Connect would be:

          connect(&opt_main, &Option::send_option, &dialog, &Dialog::set_up);
          

          Actually I don't see a need for signal/slot here as dialog is a member of MainWindow. set_up can be a normal method which you call like any other without emiting a signal:

          dialog.set_up(...);
          
          ? Offline
          ? Offline
          A Former User
          wrote on last edited by
          #16

          @jsulm Sorry, I meant to ask if ithis would be the right way of doing it:

          public slots:
             void set_up(QSqlDatabase db, int mode){ this->db = db; this->mode = mode; emit opt_dia.send_option(db, mode);}
          

          Change the connect() method as suggestion but the values don't get passed over.
          Same for adding dialog.set_up();
          Should I make QSqlDatabase db and int mode static?

          jsulmJ 1 Reply Last reply
          0
          • ? A Former User

            @jsulm Sorry, I meant to ask if ithis would be the right way of doing it:

            public slots:
               void set_up(QSqlDatabase db, int mode){ this->db = db; this->mode = mode; emit opt_dia.send_option(db, mode);}
            

            Change the connect() method as suggestion but the values don't get passed over.
            Same for adding dialog.set_up();
            Should I make QSqlDatabase db and int mode static?

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

            @SnuggleKat "Change the connect() method as suggestion but the values don't get passed over." - please show the code.
            "Should I make QSqlDatabase db and int mode static?" - please don't! Static variables are bad design in most cases.

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

            ? 1 Reply Last reply
            0
            • jsulmJ jsulm

              @SnuggleKat "Change the connect() method as suggestion but the values don't get passed over." - please show the code.
              "Should I make QSqlDatabase db and int mode static?" - please don't! Static variables are bad design in most cases.

              ? Offline
              ? Offline
              A Former User
              wrote on last edited by
              #18

              @jsulm said in Need help passing a variable to another Form (Signals/Slots):

              @SnuggleKat "Change the connect() method as suggestion but the values don't get passed over." - please show the code.
              "Should I make QSqlDatabase db and int mode static?" - please don't! Static variables are bad design in most cases.

              That's what I thought.

              void MainWindow::on_pushButton_open_clicked()
              {
                  opt_main.send_option(db, 123);
                  QObject::connect(&opt_main, &Option::send_option, &dialog, &Dialog::set_up);
                  dialog.set_up(db, 123); //also tried this which didn't help either
                  dialog.setModal(true);
                  dialog.exec();
              }
              
              jsulmJ 1 Reply Last reply
              0
              • ? A Former User

                @jsulm said in Need help passing a variable to another Form (Signals/Slots):

                @SnuggleKat "Change the connect() method as suggestion but the values don't get passed over." - please show the code.
                "Should I make QSqlDatabase db and int mode static?" - please don't! Static variables are bad design in most cases.

                That's what I thought.

                void MainWindow::on_pushButton_open_clicked()
                {
                    opt_main.send_option(db, 123);
                    QObject::connect(&opt_main, &Option::send_option, &dialog, &Dialog::set_up);
                    dialog.set_up(db, 123); //also tried this which didn't help either
                    dialog.setModal(true);
                    dialog.exec();
                }
                
                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by
                #19

                @SnuggleKat I really don't get why you use signals slots here?

                void MainWindow::on_pushButton_open_clicked()
                {
                    dialog.set_up(db, 123); //also tried this which didn't help either
                    dialog.setModal(true);
                    dialog.exec();
                }
                

                "//also tried this which didn't help either" - please show what dialog.set_up(db, 123) is doing.

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

                ? 1 Reply Last reply
                0
                • jsulmJ jsulm

                  @SnuggleKat I really don't get why you use signals slots here?

                  void MainWindow::on_pushButton_open_clicked()
                  {
                      dialog.set_up(db, 123); //also tried this which didn't help either
                      dialog.setModal(true);
                      dialog.exec();
                  }
                  

                  "//also tried this which didn't help either" - please show what dialog.set_up(db, 123) is doing.

                  ? Offline
                  ? Offline
                  A Former User
                  wrote on last edited by
                  #20

                  @jsulm
                  qDebug() shows me that it effectively does nothing. dialog.set_up() does not touch the object declared as opt_dia.

                  "mode: 12141696 - "
                  

                  12141696 seems to be a random value.
                  This is the qDebug() line:

                  qDebug() << "mode: " + QString::number(opt_dia.get_mode()) + " - " + opt_dia.get_db().userName();
                  
                  jsulmJ 1 Reply Last reply
                  0
                  • ? A Former User

                    @jsulm
                    qDebug() shows me that it effectively does nothing. dialog.set_up() does not touch the object declared as opt_dia.

                    "mode: 12141696 - "
                    

                    12141696 seems to be a random value.
                    This is the qDebug() line:

                    qDebug() << "mode: " + QString::number(opt_dia.get_mode()) + " - " + opt_dia.get_db().userName();
                    
                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #21

                    @SnuggleKat Can you show the content of dialog.set_up(...)?

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

                    ? 1 Reply Last reply
                    0
                    • jsulmJ jsulm

                      @SnuggleKat Can you show the content of dialog.set_up(...)?

                      ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by
                      #22

                      @jsulm Do you mean this?

                      public slots:
                         void set_up(QSqlDatabase db, int mode){ this->db = db; this->mode = mode; emit opt_dia.send_option(db, mode);}
                      
                      jsulmJ 1 Reply Last reply
                      0
                      • ? A Former User

                        @jsulm Do you mean this?

                        public slots:
                           void set_up(QSqlDatabase db, int mode){ this->db = db; this->mode = mode; emit opt_dia.send_option(db, mode);}
                        
                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by
                        #23

                        @SnuggleKat set_up(

                        public slots:
                           void set_up(QSqlDatabase db, int mode){ this->db = db; this->mode = mode; opt_dia.set_up(db, mode); }
                        

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

                        ? 1 Reply Last reply
                        0
                        • J.HilkJ Online
                          J.HilkJ Online
                          J.Hilk
                          Moderators
                          wrote on last edited by J.Hilk
                          #24

                          I admit, I'm a little bit out of my field here, but can you simply reassign a QSqlDatabase in that way?

                          I usually pass a QSqlDatabase-pointer between classes.


                          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                          Q: What's that?
                          A: It's blue light.
                          Q: What does it do?
                          A: It turns blue.

                          1 Reply Last reply
                          1
                          • jsulmJ jsulm

                            @SnuggleKat set_up(

                            public slots:
                               void set_up(QSqlDatabase db, int mode){ this->db = db; this->mode = mode; opt_dia.set_up(db, mode); }
                            
                            ? Offline
                            ? Offline
                            A Former User
                            wrote on last edited by
                            #25

                            @jsulm
                            Okay, it now works! Thank you.
                            I also hat to re-write a set_up() function inside the Dialog class.
                            I will clean up the way it's done by now and remember it for the next time

                            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