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. Access the UI, from multiple windows.
Forum Updated to NodeBB v4.3 + New Features

Access the UI, from multiple windows.

Scheduled Pinned Locked Moved Solved General and Desktop
53 Posts 4 Posters 15.9k 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.
  • mrjjM mrjj

    @jsulm
    And we come full circle \o/
    I told OP that 4 days ago, but he seems unwilling to
    create access functions :)
    Maybe seeing your good example, OP will feel the joy of good design
    and do it the right way.

    L Offline
    L Offline
    Loc888
    wrote on last edited by
    #30

    @mrjj This method is not working

    Settings_Window* MainWindow::Get_Window_Data()
    {
    
    return Settings_Widget;
    
    }
    

    If i press the checkerbox, it should be setted to true

    void Settings_Window::on_CheckerBox_clicked()
    {
    
        B->Get_Window_Data()->ui->CheckerBox->setChecked(true);
    
    }
    

    Then when i go to window one, and press the button

    void Window1::on_Button001_clicked()
    {
    
    MainWindow* B = new MainWindow;
    
    
    if(B->Get_Window_Data()->ui->Auto_Reset_Data_Timer->isChecked())
    {
    
        //do something
    
      }
    
    }
    

    I don't understand all your methods, so if anyone can, please correct this stuff, cuz i have enough.

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

      In what way not working ?
      it just returns the pointer to your
      Settings_Widget so only way it can fail is to return null.

      I wonder here
      void Window1::on_Button001_clicked()
      {

      MainWindow* B = new MainWindow; << you create new one. ?

      so you dont have one already ?
      Or is that on purpose ?
      So each time you click you make a new window ?

      L 1 Reply Last reply
      0
      • mrjjM mrjj

        In what way not working ?
        it just returns the pointer to your
        Settings_Widget so only way it can fail is to return null.

        I wonder here
        void Window1::on_Button001_clicked()
        {

        MainWindow* B = new MainWindow; << you create new one. ?

        so you dont have one already ?
        Or is that on purpose ?
        So each time you click you make a new window ?

        L Offline
        L Offline
        Loc888
        wrote on last edited by Loc888
        #32

        @mrjj I have another button to activate and show that window.

        MainWindow* B = new MainWindow;
        

        No,i have already one window.
        I just use this to get MainWindow method, and try to set checkerBox as true but from ther.

        If i copy the same code from that button, and paste it to Window1, it's working, but is not the way how it should work, i dont want to set it ther....

        I mean:

        MainWindow* B = new MainWindow;
        
        B->Get_Window_Data()->ui->CheckerBox->setChecked(true);
        
        
        if(B->Get_Window_Data()->ui->Auto_Reset_Data_Timer->isChecked())
        {
        
            //do something
        
          }
        

        When i say "Is not working", i mean when i click the button, checkBox should return true, and when i compare it in another window, checkBox returns false, i think because i set it to another copy... How,i don't know. It should return Settings_Widget in window1.

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

          Hi
          Im sorry if we frustrated you. We just know from experience
          what works bad over time so that is why we seem so keen to do it the right way.
          Lets start over.
          ok, so you have a normal main.cpp

          int main(int argc, char* argv[]) {
            QApplication a(argc, argv);
            MainWindow w;
            w.show();
          
            return a.exec();
          }
          

          so w is mainwindow
          and it has the true Settings_Window embedded.

          So we need Window1 to have access to MainWins Settings_Window and not a new copy.
          So Window1 should NOT new one it self but get the one from Mainwin.

          I assume Mainwindow also creates and show Window1
          You can change its constructor to take a Settings_Window * and it can then store it for accessing.

          Like

          #include "Settings_Window.h"  // so it knows the TYPE ( make to use right name if not that)
          
          class Window1 : public QMainWindow
          {
              Q_OBJECT
          Settings_Window *GivenToMe;
          public:
              explicit Window1 (QWidget *parent = 0, Settings_Window *TheTrueOne) {
          GivenToMe = TheTrueOne; // store the pointer for later
          }
              ~Window1 ();
          ....
          };
          
          // then in MainWin where you show the Window1
          void MainWindow::ShowSettings() {
          Window1 * Win1= new Window1(this,   & S_Window ); // the & to make it pointer
          Win1->show();
          }
          

          now inside
          void Window1::SomeButtonClick() {
          // you now have GivenToMe that is the Settings_Widget from MainWindow
          now you can call public functions in it
          if ( GivenToMe -> SomeFunc() ) ...

          }

          If you do not want to create public access functions but go directly via UI you have to make it public
          so in Settings_Window.h

          private:
          Ui::Settings_Windowui;
          must be
          public:
          Ui::Settings_Window
          ui;

          to allow
          if ( GivenToMe -> ui->CheckerBox->isChecked() ) ...

          --

          What we tried to make you do was to add public access function in mainwindow
          so you would say
          if ( GivenToMe ->GetSettingForX() ) ( and it just returns the ui->Checker_01->isChecked() )

          but if you really not want that, then you can make ui public and the syntax you want is then possible
          even if its not best practice/bad idea/design.

          Hope this helps. :)

          L 2 Replies Last reply
          3
          • mrjjM mrjj

            Hi
            Im sorry if we frustrated you. We just know from experience
            what works bad over time so that is why we seem so keen to do it the right way.
            Lets start over.
            ok, so you have a normal main.cpp

            int main(int argc, char* argv[]) {
              QApplication a(argc, argv);
              MainWindow w;
              w.show();
            
              return a.exec();
            }
            

            so w is mainwindow
            and it has the true Settings_Window embedded.

            So we need Window1 to have access to MainWins Settings_Window and not a new copy.
            So Window1 should NOT new one it self but get the one from Mainwin.

            I assume Mainwindow also creates and show Window1
            You can change its constructor to take a Settings_Window * and it can then store it for accessing.

            Like

            #include "Settings_Window.h"  // so it knows the TYPE ( make to use right name if not that)
            
            class Window1 : public QMainWindow
            {
                Q_OBJECT
            Settings_Window *GivenToMe;
            public:
                explicit Window1 (QWidget *parent = 0, Settings_Window *TheTrueOne) {
            GivenToMe = TheTrueOne; // store the pointer for later
            }
                ~Window1 ();
            ....
            };
            
            // then in MainWin where you show the Window1
            void MainWindow::ShowSettings() {
            Window1 * Win1= new Window1(this,   & S_Window ); // the & to make it pointer
            Win1->show();
            }
            

            now inside
            void Window1::SomeButtonClick() {
            // you now have GivenToMe that is the Settings_Widget from MainWindow
            now you can call public functions in it
            if ( GivenToMe -> SomeFunc() ) ...

            }

            If you do not want to create public access functions but go directly via UI you have to make it public
            so in Settings_Window.h

            private:
            Ui::Settings_Windowui;
            must be
            public:
            Ui::Settings_Window
            ui;

            to allow
            if ( GivenToMe -> ui->CheckerBox->isChecked() ) ...

            --

            What we tried to make you do was to add public access function in mainwindow
            so you would say
            if ( GivenToMe ->GetSettingForX() ) ( and it just returns the ui->Checker_01->isChecked() )

            but if you really not want that, then you can make ui public and the syntax you want is then possible
            even if its not best practice/bad idea/design.

            Hope this helps. :)

            L Offline
            L Offline
            Loc888
            wrote on last edited by
            #34

            @mrjj Thank you, i like exemples rly :)

            Because this is the only thing can help at least when you rly dont know what to do. Tomorrow i will try in this way.

            1 Reply Last reply
            0
            • mrjjM mrjj

              Hi
              Im sorry if we frustrated you. We just know from experience
              what works bad over time so that is why we seem so keen to do it the right way.
              Lets start over.
              ok, so you have a normal main.cpp

              int main(int argc, char* argv[]) {
                QApplication a(argc, argv);
                MainWindow w;
                w.show();
              
                return a.exec();
              }
              

              so w is mainwindow
              and it has the true Settings_Window embedded.

              So we need Window1 to have access to MainWins Settings_Window and not a new copy.
              So Window1 should NOT new one it self but get the one from Mainwin.

              I assume Mainwindow also creates and show Window1
              You can change its constructor to take a Settings_Window * and it can then store it for accessing.

              Like

              #include "Settings_Window.h"  // so it knows the TYPE ( make to use right name if not that)
              
              class Window1 : public QMainWindow
              {
                  Q_OBJECT
              Settings_Window *GivenToMe;
              public:
                  explicit Window1 (QWidget *parent = 0, Settings_Window *TheTrueOne) {
              GivenToMe = TheTrueOne; // store the pointer for later
              }
                  ~Window1 ();
              ....
              };
              
              // then in MainWin where you show the Window1
              void MainWindow::ShowSettings() {
              Window1 * Win1= new Window1(this,   & S_Window ); // the & to make it pointer
              Win1->show();
              }
              

              now inside
              void Window1::SomeButtonClick() {
              // you now have GivenToMe that is the Settings_Widget from MainWindow
              now you can call public functions in it
              if ( GivenToMe -> SomeFunc() ) ...

              }

              If you do not want to create public access functions but go directly via UI you have to make it public
              so in Settings_Window.h

              private:
              Ui::Settings_Windowui;
              must be
              public:
              Ui::Settings_Window
              ui;

              to allow
              if ( GivenToMe -> ui->CheckerBox->isChecked() ) ...

              --

              What we tried to make you do was to add public access function in mainwindow
              so you would say
              if ( GivenToMe ->GetSettingForX() ) ( and it just returns the ui->Checker_01->isChecked() )

              but if you really not want that, then you can make ui public and the syntax you want is then possible
              even if its not best practice/bad idea/design.

              Hope this helps. :)

              L Offline
              L Offline
              Loc888
              wrote on last edited by
              #35

              @mrjj

              I have few errors:

              default argument missing for parameter 2 of 'Window1::Window1(QWidget*, Settings_Window*)'
              explicit Window1(QWidget *parent = 0, Settings_Window *TheTrueOne)
              ^

              redefinition of 'Window1::Window1(QWidget*, Settings_Window*)'
              Window1::Window1(QWidget *parent, Settings_Window *TheTrueOne = 0) :
              ^

              'Window1::Window1(QWidget*, Settings_Window*)' previously defined here
              explicit Window1(QWidget *parent = 0, Settings_Window *TheTrueOne)
              ^

              Can you correct it? Because i tried what i could, but doesn't help.

              Window1.h

              #ifndef WINDOW1_H
              #define WINDOW1_H
              
              #include <QWidget>
              #include "Settings_Window.h"
              
              namespace Ui {
              class Window1;
              }
              
              class Window1 : public QWidget
              {
                  Q_OBJECT
              
                  Settings_Window *GivenToMe;
              
              public:
                  explicit Window1(QWidget *parent = 0, Settings_Window *TheTrueOne)
              {
              
                  GivenToMe = TheTrueOne; // store the pointer for later
              
              }
              
              
              ~Window1();
              
              private:
              Ui::Window1 *ui;
              };
              
              #endif // WINDOW1_H
              

              And this is Window1.cpp

              #include "window1.h"
              #include "ui_window1.h"
              #include "settings_window.h"
              
              Window1::Window1(QWidget *parent, Settings_Window *TheTrueOne = 0) :
                  QWidget(parent),
                  ui(new Ui::Window1)
              {
                  ui->setupUi(this);
              }
              
              Window1::~Window1()
              {
                  delete ui;
              }
              
              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #36

                Hi,

                Default arguments can only be set in the function declaration. So move all = 0 to the header.

                As a matter of good practice, the parent parameter should always be last. Question of coherency with the Qt library and what other developers expects.

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

                L 2 Replies Last reply
                0
                • SGaistS SGaist

                  Hi,

                  Default arguments can only be set in the function declaration. So move all = 0 to the header.

                  As a matter of good practice, the parent parameter should always be last. Question of coherency with the Qt library and what other developers expects.

                  L Offline
                  L Offline
                  Loc888
                  wrote on last edited by
                  #37

                  @SGaist Ok, i try that.

                  1 Reply Last reply
                  0
                  • SGaistS SGaist

                    Hi,

                    Default arguments can only be set in the function declaration. So move all = 0 to the header.

                    As a matter of good practice, the parent parameter should always be last. Question of coherency with the Qt library and what other developers expects.

                    L Offline
                    L Offline
                    Loc888
                    wrote on last edited by
                    #38

                    @SGaist I still have some errors the:

                    Error: redefinition of 'Window1::Window1(Settings_Window*, QWidget*)'
                    Window1::Window1(Settings_Window *TheTrueOne,QWidget *parent) : QWidget(parent),
                    ^

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

                      Do you have matching declaration and implementation ?

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

                      L 1 Reply Last reply
                      1
                      • SGaistS SGaist

                        Do you have matching declaration and implementation ?

                        L Offline
                        L Offline
                        Loc888
                        wrote on last edited by Loc888
                        #40

                        @SGaist

                        Header :

                            explicit Window1(Settings_Window *TheTrueOne = 0, QWidget *parent = 0)
                            {
                        
                                GivenToMe = TheTrueOne;
                        
                            }
                        

                        Source:

                        Window1::Window1(Settings_Window *TheTrueOne,QWidget *parent) :         
                        QWidget(parent),ui(new Ui::Window1)
                        {
                        ui->setupUi(this);
                        }
                        

                        error: redefinition of 'Window1::Window1(Settings_Window*, QWidget*)'
                        Window1::Window1(Settings_Window *TheTrueOne,QWidget *parent) : QWidget(parent),ui(new Ui::Window1)
                        ^

                        I i remove ther Settings_Window, then i have no type specified error.

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

                          You wrote the method twice: once in the header and a second time in the implementation file. That's what the compilers is complaining about. You can have only one implementation.

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

                          L 1 Reply Last reply
                          0
                          • SGaistS SGaist

                            You wrote the method twice: once in the header and a second time in the implementation file. That's what the compilers is complaining about. You can have only one implementation.

                            L Offline
                            L Offline
                            Loc888
                            wrote on last edited by Loc888
                            #42

                            @SGaist Men, this stuff is default... I just add some extra parameters... What should i remove?

                            Ps. Ok, i fixed it.

                            1 Reply Last reply
                            0
                            • L Offline
                              L Offline
                              Loc888
                              wrote on last edited by
                              #43

                              For the love of God, this stuff is not working, i lost my patience.

                              1 Reply Last reply
                              0
                              • L Offline
                                L Offline
                                Loc888
                                wrote on last edited by
                                #44

                                Can someone create just any working example?? I want it to compile it, and see if it's gonna work.

                                jsulmJ 1 Reply Last reply
                                0
                                • L Loc888

                                  Can someone create just any working example?? I want it to compile it, and see if it's gonna work.

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

                                  @Loc888 Come on it's simple. Just remove the method definition from the header file:

                                  // Header :
                                  
                                  explicit Window1(Settings_Window *TheTrueOne = 0, QWidget *parent = 0);
                                  
                                  // Source:
                                  
                                  Window1::Window1(Settings_Window *TheTrueOne,QWidget *parent) :         
                                      QWidget(parent),ui(new Ui::Window1),
                                      GivenToMe(TheTrueOne)
                                  {
                                      ui->setupUi(this);
                                  }
                                  

                                  Some reading about C++ would help.

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

                                  L 1 Reply Last reply
                                  1
                                  • jsulmJ jsulm

                                    @Loc888 Come on it's simple. Just remove the method definition from the header file:

                                    // Header :
                                    
                                    explicit Window1(Settings_Window *TheTrueOne = 0, QWidget *parent = 0);
                                    
                                    // Source:
                                    
                                    Window1::Window1(Settings_Window *TheTrueOne,QWidget *parent) :         
                                        QWidget(parent),ui(new Ui::Window1),
                                        GivenToMe(TheTrueOne)
                                    {
                                        ui->setupUi(this);
                                    }
                                    

                                    Some reading about C++ would help.

                                    L Offline
                                    L Offline
                                    Loc888
                                    wrote on last edited by Loc888
                                    #46

                                    @jsulm I fixed that issue.. I mean, when i change the checkBox in the other window, nothing change, and i try like 50 times and more, and same stuff, doesn't work,and i can't understand why.

                                    My compiler is giving me around 50 warnings, when i create non-static data member, it is normal?

                                    mrjjM 1 Reply Last reply
                                    0
                                    • L Loc888

                                      @jsulm I fixed that issue.. I mean, when i change the checkBox in the other window, nothing change, and i try like 50 times and more, and same stuff, doesn't work,and i can't understand why.

                                      My compiler is giving me around 50 warnings, when i create non-static data member, it is normal?

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

                                      @Loc888
                                      Hi
                                      Nope 50 warning is not normal.
                                      What does warnings say ?

                                      Also, if nothing happens. Are you sure u are not creating a second copy/instance ?

                                      L 1 Reply Last reply
                                      0
                                      • mrjjM mrjj

                                        @Loc888
                                        Hi
                                        Nope 50 warning is not normal.
                                        What does warnings say ?

                                        Also, if nothing happens. Are you sure u are not creating a second copy/instance ?

                                        L Offline
                                        L Offline
                                        Loc888
                                        wrote on last edited by
                                        #48

                                        @mrjj

                                        mainwindow.h:41: Warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
                                        Settings_Window* Settings_Widget = new Settings_Window;
                                        ^

                                        Men, i don't know about that instance.....I send you a simple project, and if you want., you can take a look, i am really tired.

                                        mrjjM 1 Reply Last reply
                                        0
                                        • L Loc888

                                          @mrjj

                                          mainwindow.h:41: Warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
                                          Settings_Window* Settings_Widget = new Settings_Window;
                                          ^

                                          Men, i don't know about that instance.....I send you a simple project, and if you want., you can take a look, i am really tired.

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

                                          @Loc888
                                          Hi
                                          It gives that warning if you do

                                          class xxx : whatever {
                                          int var =0;
                                          }
                                          and not using c++ 11

                                          Do you have
                                          Settings_Window* Settings_Widget = new Settings_Window;
                                          in a. h file ?

                                          Yes, please. zip project. upload to somewhere and send me link.

                                          L 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