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. Switching between two ui forms / QMainWindow screens
Forum Updated to NodeBB v4.3 + New Features

Switching between two ui forms / QMainWindow screens

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 3 Posters 3.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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi and welcome to devnet,

    Can you also show how you are setting the threads ?

    From your description it seems that you are accessing GUI elements from another thread which is not possible.

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

    N 1 Reply Last reply
    0
    • SGaistS SGaist

      Hi and welcome to devnet,

      Can you also show how you are setting the threads ?

      From your description it seems that you are accessing GUI elements from another thread which is not possible.

      N Offline
      N Offline
      nitks.abhinav
      wrote on last edited by
      #3

      Hi SGaist ,

      Thankyou,

      I know that we cannot access GUI elements from worker thread and I think I am not doing that, but still below is the complete code for you.
      The SLOT function which switches the ui is rcvInitData().

      Files:
      clientthread.h (worker thread)
      coregui.h (second ui form/screen)
      lsrgui.h (first ui form/screen)
      base.h

      clientthread.cpp
      coregui.cpp
      lsrgui.cpp
      main.cpp

      /clientthread.h/
      class ClientThread : public QThread
      {
      Q_OBJECT

      signals:
      void sendInitData();
      private:
      void run();
      QString m_lastTime;
      private slots:
      void timerHit();

      };

      /coregui.h/
      namespace Ui {
      class RaptorCoreGUI;
      }

      class RaptorCoreGUI : public QMainWindow
      {
      Q_OBJECT

      public:
      explicit RaptorCoreGUI(QWidget *parent = 0);
      ~RaptorCoreGUI();
      void setlabel(QString);

      private:
      Ui::RaptorCoreGUI *ui;
      };

      /lsrgui.h/
      namespace Ui {
      class RaptorLrsGUI;
      }

      class RaptorLrsGUI : public QMainWindow
      {
      Q_OBJECT

      public:
      explicit RaptorLrsGUI(QWidget *parent = 0);
      ~RaptorLrsGUI();
      void setlabel(QString);

      private:
      Ui::RaptorLrsGUI *ui;
      };

      /base.h/
      class Base : public QObject
      {
      Q_OBJECT
      public:
      RaptorLrsGUI *lrsGUI;
      RaptorCoreGUI *coreGUI;
      QStackedWidget *stackedWidget;
      Base();

      private slots:
      void rcvInitData();
      void rcvLPNotif();
      void rcvErrCounterInfo();
      void rcvGenNotif();
      };

      **/clientthread.c /
      void ClientThread::run()
      {
      QTimer timer;
      connect(&timer, SIGNAL(timeout()), this, SLOT(timerHit()), Qt::DirectConnection);
      timer.setInterval(5000);
      timer.start(); // puts one event in the threads event queue
      exec();
      timer.stop();
      }

      void ClientThread::timerHit()
      {
      qDebug() << "Client Thread: Emitting sendMsg signal\n";
      emit sendInitData();
      }

      /coregui.cpp/
      RaptorCoreGUI::RaptorCoreGUI(QWidget *parent) :
      QMainWindow(parent, Qt::FramelessWindowHint),
      ui(new Ui::RaptorCoreGUI)
      {
      ui->setupUi(this);
      this->setAutoFillBackground(true);
      this->setStyleSheet("background-color:white;");
      }

      RaptorCoreGUI::~RaptorCoreGUI()
      {
      delete ui;
      }

      void RaptorCoreGUI::setlabel(QString label)
      {
      ui->label->setText(label);
      }

      /lsrgui.cpp/
      RaptorLrsGUI::RaptorLrsGUI(QWidget *parent) :
      QMainWindow(parent, Qt::FramelessWindowHint),
      ui(new Ui::RaptorLrsGUI)
      {

      ui->setupUi(this);
      this->setAutoFillBackground(true);
      this->setStyleSheet("background-color:white;");   
      

      }

      RaptorLrsGUI::~RaptorLrsGUI()
      {
      delete ui;
      }

      void RaptorLrsGUI::setlabel(QString label)
      {
      ui->label->setText(label);
      }

      /base.cpp/
      Base::Base()
      {
      qDebug() << "Base CTOR called\n";

         //Show the first screen, loading raptor status       
         this->lrsGUI = new RaptorLrsGUI;
         this->lrsGUI->setlabel(QString("Loading Raptor Status..."));
         this->lrsGUI->showMaximized();
         this->lrsGUI->show();
      
         //this->coreGUI = coreGUI;
         this->coreGUI = new RaptorCoreGUI;
      

      }

      void Base::rcvInitData()
      {
      this->lrsGUI->hide();
      this->coreGUI->setlabel(QString("Raptor Status..."));
      this->coreGUI->setGeometry(480,272,-0,+128);
      this->coreGUI->showMaximized();
      this->coreGUI->show(); // ISSUE: DOES NOT SHOW THE SECOND GUI, BUT IF WE COMMENT OUT THE SHOW OF FIRST GUI (this->lrsGUI->show()),
      THEN SECOND ONE IS SHOWN PROPERLY

          qDebug()<< "Main Thread (CALLBACK): EXiting Display initial screen\n";
      

      }

      int main(int argc, char *argv[])
      {
      QApplication app(argc, argv);
      RaptorLrsGUI LrsGui;
      RaptorCoreGUI CoreGui;

      Base baseObj;
      
      //instantiate Client thread object
      ClientThread clientThread;
      
      QObject::connect(&clientThread, SIGNAL(sendInitData()), &baseObj, SLOT(rcvInitData()), Qt::QueuedConnection);
      
      qDebug() << "Main Thread: starting clockThread\n";
      clientThread.start();
      
      app.exec();
      qDebug() << "Mian Thread: Quiting clockThread\n";
      clientThread.quit();
      qDebug() << "Main Thread: Waiting on clockThread \n";
      clientThread.wait();
      
      return 0;
      

      }

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

        Not to sound rude but that code base is a bit messy:

        • You have two **Gui objects in you main.cpp that are not used at all.
        • You are setting a geometry on your coreGui object but then call showMaximized followed by show.

        Also using a custom thread only for a 5 second timer is way overkill.

        What exactly do you want to do with your application ?

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

        N 1 Reply Last reply
        1
        • SGaistS SGaist

          Not to sound rude but that code base is a bit messy:

          • You have two **Gui objects in you main.cpp that are not used at all.
          • You are setting a geometry on your coreGui object but then call showMaximized followed by show.

          Also using a custom thread only for a 5 second timer is way overkill.

          What exactly do you want to do with your application ?

          N Offline
          N Offline
          nitks.abhinav
          wrote on last edited by
          #5

          @SGaist said in Switching between two ui forms / QMainWindow screens:

          ou have two **Gui objects in you main.cpp that are not used at all.
          You are setting a geometry on your coreGui object but then call showMaximized followed by show.

          Also using a custom thread only for a 5 second timer is way overkill.
          What exactly do you want to do with your application ?

          Yes I know , this is kind of a PoC I am doing and this is what I want to achieve:

          1. Keep two separate GUIs (ui forms).
          2. When application starts, it should spawn a thread which will run timer and at the same time display first GUI on screen (happens in C'TOR).
          3. When the timer of the thread goes off, it will emit its SIGNAL and SLOT function of main will get called which will stop the first GUI and replace with second one.

          Thanks

          1 Reply Last reply
          0
          • dheerendraD Offline
            dheerendraD Offline
            dheerendra
            Qt Champions 2022
            wrote on last edited by
            #6

            Which platform r u trying this ? Is it embedded box or desktop ? I have sample for ur use case. I can share you. It works perfectly.

            Dheerendra
            @Community Service
            Certified Qt Specialist
            http://www.pthinks.com

            N 1 Reply Last reply
            0
            • dheerendraD dheerendra

              Which platform r u trying this ? Is it embedded box or desktop ? I have sample for ur use case. I can share you. It works perfectly.

              N Offline
              N Offline
              nitks.abhinav
              wrote on last edited by
              #7

              @dheerendra

              Hi, Its for embedded Linux.

              1 Reply Last reply
              0
              • dheerendraD Offline
                dheerendraD Offline
                dheerendra
                Qt Champions 2022
                wrote on last edited by
                #8

                Does you logic works on desktop platform ?

                Dheerendra
                @Community Service
                Certified Qt Specialist
                http://www.pthinks.com

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

                  And why not just use a single shot QTimer ?

                  I really fail to see the use for that secondary thread except needless complexity.

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

                  N 1 Reply Last reply
                  2
                  • SGaistS SGaist

                    And why not just use a single shot QTimer ?

                    I really fail to see the use for that secondary thread except needless complexity.

                    N Offline
                    N Offline
                    nitks.abhinav
                    wrote on last edited by
                    #10

                    @SGaist

                    Hi,

                    This is just for PoC, BelowI created application with one QMainWindow class and two ui classes derived from QWidget. Then I used QStackedWidget to switch the ui forms but
                    I cannot see anything on screen.
                    Thank you for help,

                    /Second UI */
                    namespace Ui {
                    class RaptorCoreGUI;
                    }
                     
                    class RaptorCoreGUI : public QWidget
                    {
                        Q_OBJECT
                     
                    public:
                        explicit RaptorCoreGUI(QWidget *parent = 0);
                        ~RaptorCoreGUI();
                        void configInitData(bool);
                        void setlabel(QString);
                     
                    private:
                        Ui::RaptorCoreGUI *ui;
                    };
                     
                    /*First UI*/
                    amespace Ui {
                    class RaptorLrsGUI;
                    }
                     
                    class RaptorLrsGUI : public QWidget
                    {
                        Q_OBJECT
                     
                    public:
                        explicit RaptorLrsGUI(QWidget *parent = 0);
                        ~RaptorLrsGUI();
                        void setlabel(QString);
                     
                    private:
                        Ui::RaptorLrsGUI *ui;
                    };
                     
                    /*Base class  derived from  QMainWindow*/
                    class Base : public QMainWindow
                    {
                        Q_OBJECT
                    public:
                       RaptorLrsGUI *lrsGUI;
                       RaptorCoreGUI *coreGUI;
                       QStackedWidget *stackedWidget;
                       QVBoxLayout *layout;
                      ~Base();
                       explicit Base (QWidget *parent = 0);
                     
                     
                    private slots:
                        void rcvInitData();
                    };
                     
                    /*Second UI CPP*/
                    RaptorCoreGUI::RaptorCoreGUI(QWidget *parent) :
                        QWidget(parent),
                        ui(new Ui::RaptorCoreGUI)
                    {
                        ui->setupUi(this);
                        this->setAutoFillBackground(true);
                        this->setStyleSheet("background-color:white;");
                    }
                     
                    RaptorCoreGUI::~RaptorCoreGUI()
                    {
                        delete ui;
                    }
                     
                     
                    void RaptorCoreGUI::setlabel(QString label)
                    {
                        qDebug() << "Main Thread(COREGUI): Setting Label\n";    
                        ui->label->setText(label);
                    }
                     
                    /*First UI cpp*/
                    RaptorLrsGUI::RaptorLrsGUI(QWidget *parent) :
                        QWidget(parent),
                        ui(new Ui::RaptorLrsGUI)
                    {    
                        ui->setupUi(this);
                        this->setAutoFillBackground(true);
                        this->setStyleSheet("background-color:white;");
                    }
                     
                    RaptorLrsGUI::~RaptorLrsGUI()
                    {
                        qDebug() << "Main Thread: destroying the ui object \n";
                        delete ui;
                    }
                     
                    void RaptorLrsGUI::setlabel(QString label)
                    {
                        qDebug() << "Main Thread(LSRGUI): Setting Label\n";    
                        ui->label->setText(label);
                    }
                     
                     
                    /*main.cpp*/
                    Base::Base(QWidget *parent) :
                          QMainWindow(parent, Qt::FramelessWindowHint)
                    {
                           qDebug() << "Base CTOR called\n";
                     
                           QPalette pal = palette();  // retrieves the default palette for the widget, as defined by the app's style
                           pal.setColor( QPalette::Window, Qt::white );
                           setPalette( pal );
                     
                           setAutoFillBackground( true );
                     
                     
                           //Show the first screen, loading raptor status       
                           lrsGUI = new RaptorLrsGUI;
                           lrsGUI->setlabel(QString("Loading Raptor Status..."));
                           coreGUI = new RaptorCoreGUI;
                     
                           stackedWidget = new QStackedWidget(this);
                           stackedWidget->addWidget(lrsGUI);
                           stackedWidget->addWidget(coreGUI);
                     
                           stackedWidget->setCurrentIndex(0);
                           setCentralWidget(stackedWidget);
                    }
                     
                    Base::~Base()
                    {
                        qDebug() << "Main Thread: destroying base objects \n";
                        delete lrsGUI;
                        delete coreGUI;
                        delete stackedWidget;
                    }
                     
                    void Base::rcvInitData()
                    {
                        qDebug()<< "Main Thread (CALLBACK): Display second screen\n";
                        stackedWidget->setCurrentIndex(1);
                    }
                     
                    //! [1]
                    int main(int argc, char *argv[])
                    {
                        QApplication app(argc, argv);
                     
                        //Instantiate base class    
                        Base baseObj;
                     
                     
                        //instantiate Client thread object
                        ClientThread clientThread;
                        qDebug() << "Connecting sendmsg and handle_callback1()\n";
                        QObject::connect(&clientThread, SIGNAL(sendInitData()), &baseObj, SLOT(rcvInitData()), Qt::QueuedConnection);
                     
                        qDebug() << "Main Thread: starting clockThread\n";
                        clientThread.start();
                     
                        app.exec();
                        qDebug() << "Mian Thread: Quiting clockThread\n";
                        clientThread.quit();
                        qDebug() << "Main Thread: Waiting on clockThread \n";
                        clientThread.wait();
                        return 0;
                    }
                    
                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #11

                      Is it me or are you missing a call to baseObj.show(); in your main.cpp ?

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

                      N 1 Reply Last reply
                      0
                      • SGaistS SGaist

                        Is it me or are you missing a call to baseObj.show(); in your main.cpp ?

                        N Offline
                        N Offline
                        nitks.abhinav
                        wrote on last edited by
                        #12

                        @SGaist

                        Yes, that was the thing I missed, silly mistake.

                        Thank you very much for help.

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

                          You're welcome !

                          Since you have it working now, please mark the thread as solved using the "Topic Tools" button so that other forum users may know a solution has been found :)

                          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
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved