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. Call widget of mainwindow in an other class
Forum Updated to NodeBB v4.3 + New Features

Call widget of mainwindow in an other class

Scheduled Pinned Locked Moved Solved General and Desktop
15 Posts 3 Posters 1.5k 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.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by
    #1
    #include <QApplication>
    #include "mainwindow.h"
    #include "engine/usapp_app.h"
    #include "engine/workingset.h"
    #include "splash.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    //    MainWindow w;
    //    w.showMaximized();
        Splash w;
        w.show();
    
    

    I wrote this in the main and the class splash must call the mainWindow:

    void Splash::on_pushButton_2_clicked()
    {
        close();
        ptr->stackedWidget_3->setCurrentIndex(3);
        g.showMaximized();
    
    
    }
    

    in Spash.h:

    private:
        MainWindow g;
        Ui::MainWindow *ptr;
        Ui::Splash *ui;
    };
    

    but the program crashes but I don't know

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

      Hi
      Are you sure it crashes ?
      Not just closing?
      try for test

      void Splash::on_pushButton_2_clicked()
      {
          g.showMaximized();
      }
      

      and see if mainwindow shows.

      ? 1 Reply Last reply
      0
      • mrjjM mrjj

        Hi
        Are you sure it crashes ?
        Not just closing?
        try for test

        void Splash::on_pushButton_2_clicked()
        {
            g.showMaximized();
        }
        

        and see if mainwindow shows.

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

        @mrjj if I write only this works, but why in the other way doesn't work, the application writes crashes

        mrjjM Cobra91151C 2 Replies Last reply
        0
        • ? A Former User

          @mrjj if I write only this works, but why in the other way doesn't work, the application writes crashes

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

          @vale88
          I dont think it crashes i think it just closes as there is no top window.
          QApplication handles that.

          you can try

          int main(int argc, char *argv[])
          {
              QApplication a(argc, argv);
             a.setQuitOnLastWindowClosed(false);
          
          //    MainWindow w;
          //    w.showMaximized();
              Splash w;
              w.show();
          

          and see if that helps.

          1 Reply Last reply
          0
          • ? A Former User

            @mrjj if I write only this works, but why in the other way doesn't work, the application writes crashes

            Cobra91151C Offline
            Cobra91151C Offline
            Cobra91151
            wrote on last edited by Cobra91151
            #5

            @vale88

            Hello! I think the problem is with not initialized pointer - Ui::MainWindow *ptr;. For example try to initialize it in the Splash constructor.

            Example:

            ptr = new Ui::MainWindow();
            

            Also don't forget to delete ptr in the Splash destructor later.

            By the way, try to attach the debugger to detect the issue.

            ? 1 Reply Last reply
            0
            • Cobra91151C Cobra91151

              @vale88

              Hello! I think the problem is with not initialized pointer - Ui::MainWindow *ptr;. For example try to initialize it in the Splash constructor.

              Example:

              ptr = new Ui::MainWindow();
              

              Also don't forget to delete ptr in the Splash destructor later.

              By the way, try to attach the debugger to detect the issue.

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

              @Cobra91151 I wrote:

              void Splash::on_pushButton_2_clicked()
              {
                  ptr = new Ui::MainWindow;
              
                  close();
                  g.showMaximized();
                  ptr->stackedWidget_3->setCurrentIndex(3);
                  //emit invio_segnaleM();
              
              }
              
              

              but it crashes

              Cobra91151C 1 Reply Last reply
              0
              • ? A Former User

                @Cobra91151 I wrote:

                void Splash::on_pushButton_2_clicked()
                {
                    ptr = new Ui::MainWindow;
                
                    close();
                    g.showMaximized();
                    ptr->stackedWidget_3->setCurrentIndex(3);
                    //emit invio_segnaleM();
                
                }
                
                

                but it crashes

                Cobra91151C Offline
                Cobra91151C Offline
                Cobra91151
                wrote on last edited by Cobra91151
                #7

                @vale88

                First, the problem with your code is, that every time you press the button (button click) new object generates and it create the memory leak.

                Set ptr = new Ui::MainWindow; to the Splash constructor to fix it and delete it in the destructor.

                Secondly, if it still crashes, try to debug your application with attached debugger.

                ? 1 Reply Last reply
                0
                • Cobra91151C Cobra91151

                  @vale88

                  First, the problem with your code is, that every time you press the button (button click) new object generates and it create the memory leak.

                  Set ptr = new Ui::MainWindow; to the Splash constructor to fix it and delete it in the destructor.

                  Secondly, if it still crashes, try to debug your application with attached debugger.

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

                  @Cobra91151 I tried with debug but I on't understand, it says that the inferior is...

                  Cobra91151C 1 Reply Last reply
                  0
                  • ? A Former User

                    @Cobra91151 I tried with debug but I on't understand, it says that the inferior is...

                    Cobra91151C Offline
                    Cobra91151C Offline
                    Cobra91151
                    wrote on last edited by
                    #9

                    @vale88

                    What is your compiler and OS? Attach the screenshot of the issue from debugger here.

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

                      Hi
                      Why are you creating
                      void Splash::on_pushButton_2_clicked()
                      {
                      ptr = new Ui::MainWindow; <<< WHY ? the g already done it
                      close();
                      g.showMaximized();
                      // this is not good. = ptr->stackedWidget_3->setCurrentIndex(3);
                      //should be
                      g.SetPage(3); // SetPage(int index) being a new function that does ui->stackedWidget_3->setCurrentIndex(index);
                      //emit invio_segnaleM();
                      }

                      ? 1 Reply Last reply
                      0
                      • mrjjM mrjj

                        Hi
                        Why are you creating
                        void Splash::on_pushButton_2_clicked()
                        {
                        ptr = new Ui::MainWindow; <<< WHY ? the g already done it
                        close();
                        g.showMaximized();
                        // this is not good. = ptr->stackedWidget_3->setCurrentIndex(3);
                        //should be
                        g.SetPage(3); // SetPage(int index) being a new function that does ui->stackedWidget_3->setCurrentIndex(index);
                        //emit invio_segnaleM();
                        }

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

                        @mrjj yes but if I want to acceed to an object of the mainwindow, like a pushButton, how must I do?

                        mrjjM 1 Reply Last reply
                        0
                        • ? A Former User

                          @mrjj yes but if I want to acceed to an object of the mainwindow, like a pushButton, how must I do?

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

                          @vale88
                          Well you can make the UI public. Bad design.
                          Or simply add public functions to MainWindow that does what you want.
                          like
                          g.SomethingWithButton();

                          inside SomethingWithButton(), you have access to its UI and can
                          do what ever you like.

                          So make a few functions, that does what you need with MainWindows Widgets.

                          ? 1 Reply Last reply
                          1
                          • mrjjM mrjj

                            @vale88
                            Well you can make the UI public. Bad design.
                            Or simply add public functions to MainWindow that does what you want.
                            like
                            g.SomethingWithButton();

                            inside SomethingWithButton(), you have access to its UI and can
                            do what ever you like.

                            So make a few functions, that does what you need with MainWindows Widgets.

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

                            @mrjj I used connect and it works, but nw I try in this way

                            mrjjM 1 Reply Last reply
                            0
                            • ? A Former User

                              @mrjj I used connect and it works, but nw I try in this way

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

                              @vale88
                              The good part about using functions to access the private UI in MainWindow is
                              that rest of program dont know which widgets it has.
                              So if you change something in MainWindow, you only need to change one other place
                              in the (access) function. rest of the program needs no changes.

                              ? 1 Reply Last reply
                              0
                              • mrjjM mrjj

                                @vale88
                                The good part about using functions to access the private UI in MainWindow is
                                that rest of program dont know which widgets it has.
                                So if you change something in MainWindow, you only need to change one other place
                                in the (access) function. rest of the program needs no changes.

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

                                @mrjj thanks it works

                                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