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.
  • L Loc888

    @mrjj But ther is no way to just simply send the widnows object as reference ? Becuse ye, 75% of that setting window is just CheckerBoxe's, but some of stuff is different.
    It can help me, but i would like to find 100% solution

    I would like to have the same flexibility like in MainWindow.

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

    @Loc888
    Well u can move the UI object to public section of the class and its accessible from outside but
    it leads to spaghetti code and really not recommended.
    External users of a class should not know the inner details and hence providing access functions beats
    letting everybody know what widgets a window has.

    L 1 Reply Last reply
    1
    • mrjjM mrjj

      @Loc888
      Well u can move the UI object to public section of the class and its accessible from outside but
      it leads to spaghetti code and really not recommended.
      External users of a class should not know the inner details and hence providing access functions beats
      letting everybody know what widgets a window has.

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

      @mrjj No, i dont like it, even if it helps, i mean make it public. Friend class should help, ye?

      And i am not talking about the class, i am talking about object, because like i said, i can access the class from Window1, but i need to access object S_Window from Setting_Window class, and that object is created in MainWindow, that's the problem.

      mrjjM 1 Reply Last reply
      0
      • L Loc888

        @mrjj No, i dont like it, even if it helps, i mean make it public. Friend class should help, ye?

        And i am not talking about the class, i am talking about object, because like i said, i can access the class from Window1, but i need to access object S_Window from Setting_Window class, and that object is created in MainWindow, that's the problem.

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

        @Loc888
        Ok, and its not possible to use signals and hook object up
        in mainwindow ?
        There is nothing stopping you from giving other class a pointer to some widget.
        like in mainwindow
        Local *local = new Local()
        Other *other= new Other()
        UseClass *useclass= new UseClass (this, local, other);

        L 1 Reply Last reply
        0
        • mrjjM mrjj

          @Loc888
          Ok, and its not possible to use signals and hook object up
          in mainwindow ?
          There is nothing stopping you from giving other class a pointer to some widget.
          like in mainwindow
          Local *local = new Local()
          Other *other= new Other()
          UseClass *useclass= new UseClass (this, local, other);

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

          @mrjj I create it with pointer already, i mean the object.
          I dont know how to use signal and slots in this example, what and wher should i type to pass the object??
          I use it with timers, but not with Windows objects.

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

            Hi
            With signals and slots your would pass the data not the objects.
            Normally you hook things up in mainwindow as it knows most other class.
            But really depends on where its created etc.

            L 1 Reply Last reply
            2
            • mrjjM mrjj

              Hi
              With signals and slots your would pass the data not the objects.
              Normally you hook things up in mainwindow as it knows most other class.
              But really depends on where its created etc.

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

              @mrjj Sorry, but i rly dont understand... I can pass the object here

              void MainWindow :: GetWindowData(Settings_Window* S_Window_Temp)   
               {
              
                   S_Window_Temp =  & S_Window;
              
              }
              

              So why i cant make a reference to it from another window, if i have the access to pass it??

              mrjjM 1 Reply Last reply
              0
              • L Loc888

                @mrjj Sorry, but i rly dont understand... I can pass the object here

                void MainWindow :: GetWindowData(Settings_Window* S_Window_Temp)   
                 {
                
                     S_Window_Temp =  & S_Window;
                
                }
                

                So why i cant make a reference to it from another window, if i have the access to pass it??

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

                @Loc888
                Hi
                Im not sure what part is causing your problems.
                Maybe we talk about different things.

                Yes, you can make a reference to a window.
                or give a pointer / ref to a window to another window.

                Like create settings_win in main.cpp
                give it to mainwindow.
                Mainwindow create a new Window and give settings_win to that also.

                L 1 Reply Last reply
                0
                • mrjjM mrjj

                  @Loc888
                  Hi
                  Im not sure what part is causing your problems.
                  Maybe we talk about different things.

                  Yes, you can make a reference to a window.
                  or give a pointer / ref to a window to another window.

                  Like create settings_win in main.cpp
                  give it to mainwindow.
                  Mainwindow create a new Window and give settings_win to that also.

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

                  @mrjj Yes, and that's the problem. Maybe i name this topic title a little bit bad, but i dont have any problem with access, because i can access them all.

                  The problem is, when i pass the window with that function, it's seems like another copy, not reference, so when i change something, nothing happens because it change the copy variables, and i dont know why it happend.

                  If i pass ther the window object, UI stuff should be ther??

                  jsulmJ 1 Reply Last reply
                  0
                  • L Loc888

                    @mrjj Yes, and that's the problem. Maybe i name this topic title a little bit bad, but i dont have any problem with access, because i can access them all.

                    The problem is, when i pass the window with that function, it's seems like another copy, not reference, so when i change something, nothing happens because it change the copy variables, and i dont know why it happend.

                    If i pass ther the window object, UI stuff should be ther??

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

                    @Loc888 Let's clean up your code.

                    // You need to declare S_Window_Temp as reference to pointer, else you cannot change it inside GetWindowData!
                    void MainWindow :: GetWindowData(Settings_Window* &S_Window_Temp)   //<< Here i send Object from Settings_Window created in Window1
                    {  
                     S_Window_Temp =  &S_Window; 
                    
                     //  So i expect C (Object form Window1)  should be equal to S_Window (Object form MainWindow ), but it's not.
                    }
                    

                    Actually you should simply return the pointer from GetWindowData as your current API design is bad (it isn't a good idea to change method parameters from inside the method):

                    Settings_Window* void MainWindow :: GetWindowData()
                    {  
                        return &S_Window; 
                    }

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

                    L 1 Reply Last reply
                    2
                    • jsulmJ jsulm

                      @Loc888 Let's clean up your code.

                      // You need to declare S_Window_Temp as reference to pointer, else you cannot change it inside GetWindowData!
                      void MainWindow :: GetWindowData(Settings_Window* &S_Window_Temp)   //<< Here i send Object from Settings_Window created in Window1
                      {  
                       S_Window_Temp =  &S_Window; 
                      
                       //  So i expect C (Object form Window1)  should be equal to S_Window (Object form MainWindow ), but it's not.
                      }
                      

                      Actually you should simply return the pointer from GetWindowData as your current API design is bad (it isn't a good idea to change method parameters from inside the method):

                      Settings_Window* void MainWindow :: GetWindowData()
                      {  
                          return &S_Window; 
                      }
                      L Offline
                      L Offline
                      Loc888
                      wrote on last edited by
                      #13

                      @jsulm If i just copy and paste, your code, it gives me an error.

                      The best solution I found is just create the definition of the object in mainwindow.cpp under include, i test it with my own class, and it works exacly how i wanted it.

                      Unfortunately when i do the same thing with the Window, it crash the application and gives a message:

                      "QWidget: Must construct a QApplication before a QWidget"

                      Any way to fix it?

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

                        Hi,

                        The usual fix to this one is: don't create static QWidget based objects.

                        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

                          Hi,

                          The usual fix to this one is: don't create static QWidget based objects.

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

                          @SGaist I dont know what you mean.

                          mrjjM 1 Reply Last reply
                          0
                          • L Loc888

                            @SGaist I dont know what you mean.

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

                            @Loc888
                            Hi
                            You cannot have global Widgets as they are NOT
                            allow to be constructed before QApplication in main.
                            They must be pointers and you can first new them After application is created.

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

                              If you have anything that looks like static MyClass thingy where MyClass is derived from QWidget, then remove it.

                              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
                              • mrjjM mrjj

                                @Loc888
                                Hi
                                You cannot have global Widgets as they are NOT
                                allow to be constructed before QApplication in main.
                                They must be pointers and you can first new them After application is created.

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

                                @mrjj I tried by reference, and this happend:

                                Error: 'QWidget& QWidget::operator=(const QWidget&)' is private
                                Class &operator=(const Class &) Q_DECL_EQ_DELETE;
                                ^

                                mingw48_32\include\QtWidgets\qwidget.h:728: in expansion of macro 'Q_DISABLE_COPY'
                                Q_DISABLE_COPY(QWidget)
                                ^

                                It happend in this line Class &operator=(const Class &) Q_DECL_EQ_DELETE;

                                I try later with pointers, and will see what happend.

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

                                  For more information why, read this.

                                  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

                                    For more information why, read this.

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

                                    @SGaist

                                    Now i tried with pointers, error :

                                    error: invalid operands of types 'Settings_Window*' and 'Settings_Window*' to binary 'operator*'
                                    A* &Settings_Widget;
                                    ^

                                    void MainWindow::Get_Window_Data(Settings_Window* A)
                                    {

                                    A* &Settings_Widget;
                                    

                                    }

                                    What i did wrong?

                                    mrjjM 1 Reply Last reply
                                    0
                                    • L Loc888

                                      @SGaist

                                      Now i tried with pointers, error :

                                      error: invalid operands of types 'Settings_Window*' and 'Settings_Window*' to binary 'operator*'
                                      A* &Settings_Widget;
                                      ^

                                      void MainWindow::Get_Window_Data(Settings_Window* A)
                                      {

                                      A* &Settings_Widget;
                                      

                                      }

                                      What i did wrong?

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

                                      @Loc888
                                      Hi
                                      Why not just
                                      Settings_Window* MainWindow::Get_Window_Data()
                                      {
                                      return Settings_Widget; // Settings_Widget is * (pointer) ?
                                      }

                                      L 1 Reply Last reply
                                      1
                                      • mrjjM mrjj

                                        @Loc888
                                        Hi
                                        Why not just
                                        Settings_Window* MainWindow::Get_Window_Data()
                                        {
                                        return Settings_Widget; // Settings_Widget is * (pointer) ?
                                        }

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

                                        @mrjj

                                        It run at least, but is not working. If i check something, then press the button with this code, nothing happened. Probably is another copy.
                                        I am tired, tomorrow i try something else.

                                        Is this the way how i should use it?

                                        MainWindow B;
                                        
                                        
                                        if(B.Get_Window_Data()->ui->Checker_Box_01->isChecked())
                                        {
                                        
                                            //Do something
                                        
                                        }
                                        
                                        jsulmJ 1 Reply Last reply
                                        0
                                        • mrjjM Offline
                                          mrjjM Offline
                                          mrjj
                                          Lifetime Qt Champion
                                          wrote on last edited by mrjj
                                          #23

                                          Hi
                                          Yes but im old school and always check pointers
                                          so i would do

                                          MainWindow B; // this should not be a second instance but the one you (might) create in main.cpp

                                          Settings_Window * win=B.Get_Window_Data();

                                          if (!win) {
                                          qDebug() << "NULL ptr from Get_Window_Data";
                                          return;
                                          }
                                          if(win->ui->Checker_Box_01->isChecked())
                                          {
                                              //Do something
                                          }
                                          if(win->ui->Checker_Box_XX->isChecked())
                                          {
                                              //Do something
                                          }
                                          
                                          

                                          However, the UI variable is private so unless the using class is friend, its not allowed.
                                          So you make make UI public ( bad design )
                                          or provide access functions for the widgets.

                                          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