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. Launch a second view on a pushed button
Qt 6.11 is out! See what's new in the release blog

Launch a second view on a pushed button

Scheduled Pinned Locked Moved Solved General and Desktop
27 Posts 3 Posters 9.6k 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.
  • L Offline
    L Offline
    Lucian
    wrote on last edited by Lucian
    #4

    Hey @mrjj ,
    I have also try this but doesn't work eider. :(

    mrjjM 1 Reply Last reply
    0
    • L Lucian

      Hey @mrjj ,
      I have also try this but doesn't work eider. :(

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

      @Lucian

      ok can u try

      QQuickView * view = new QQuickView(this)
      view->setSource(QUrl("qrc:/test.qml"));
      view->setResizeMode(QQuickView::SizeRootObjectToView);
      view->show();

      (it leaks but , just for test)

      1 Reply Last reply
      0
      • L Offline
        L Offline
        Lucian
        wrote on last edited by
        #6

        No @mrjj
        Still have the same problem. I can't solve this thing. (

        mrjjM 1 Reply Last reply
        0
        • L Lucian

          No @mrjj
          Still have the same problem. I can't solve this thing. (

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

          @Lucian
          Ok then its not a variable running out of scope.

          And you have tested that
          Test::Butt()
          is called?

          Also try
          QQuickView * view = new QQuickView;
          instead of
          QQuickView * view = new QQuickView()

          Not sure if u want the view to be inside something or in a window.
          IF you dont give a Qwidget a parent it will become a window.
          Else its inserted into parent.

          Also the code

            QQuickView view;
              view.setSource(QUrl("qrc:/test.qml"));
              view.setResizeMode(QQuickView::SizeRootObjectToView);
              view.show();
          

          Can work from main but if u do the same in a function, you have this problem that
          as soon as functions ends, it will delete view
          so right after view.show(); is called it will be deleted. ( so might not show at all)
          That is why i showed
          QQuickView * view = new QQuickView(this)
          That wont run out of scope.

          1 Reply Last reply
          0
          • L Offline
            L Offline
            Lucian
            wrote on last edited by Lucian
            #8

            I have try everything, it doesn't work. Every time creates a new window but is empty.
            I don't understand why doesn't work..
            If i remove

            this->proc->start("some_executabele", QIODevice::ReadWrite);
            this->proc->waitForFinished(-1);
            

            Works ok...
            My function in pushed button now looks like this:

                QQuickView* view
                view = new QQuickView();
                view->setSource(QUrl("qrc:/loading.qml"));
                view->setResizeMode(QQuickView::SizeRootObjectToView);
                view->show();
                this->proc->start("some_executabele", QIODevice::ReadWrite);
                this->proc->waitForFinished(-1);
            

            Thank you for your help @mrjj

            mrjjM 1 Reply Last reply
            0
            • L Lucian

              I have try everything, it doesn't work. Every time creates a new window but is empty.
              I don't understand why doesn't work..
              If i remove

              this->proc->start("some_executabele", QIODevice::ReadWrite);
              this->proc->waitForFinished(-1);
              

              Works ok...
              My function in pushed button now looks like this:

                  QQuickView* view
                  view = new QQuickView();
                  view->setSource(QUrl("qrc:/loading.qml"));
                  view->setResizeMode(QQuickView::SizeRootObjectToView);
                  view->show();
                  this->proc->start("some_executabele", QIODevice::ReadWrite);
                  this->proc->waitForFinished(-1);
              

              Thank you for your help @mrjj

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

              @Lucian
              Hi
              It looks ok.
              ( Note, u create a new QQuickView each time. So its a leak but that u can fix later )

              I would look at what
              http://doc.qt.io/qt-5/qquickview.html#errors
              returns.

              To see if it has some issue running/loading.

              Update:
              Just to be sure. We are debugging the QQuickView and setSource
              and nothing related to waitForFinished ?

              Or are you saying that it works until you use QProcess then windows is empty?

              1 Reply Last reply
              0
              • L Offline
                L Offline
                Lucian
                wrote on last edited by
                #10

                Yes,,works until i use QProcess.
                If i let the button handle without QProcess it works.
                It is possible so lunch a QQuickView in a new QProcess? Maybe current process is the reason why doesn't work .

                mrjjM 1 Reply Last reply
                0
                • L Lucian

                  Yes,,works until i use QProcess.
                  If i let the button handle without QProcess it works.
                  It is possible so lunch a QQuickView in a new QProcess? Maybe current process is the reason why doesn't work .

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

                  @Lucian

                  Then i think is what happens.
                  The setSource starts to load. its still loading when functions returns.

                  then waitForFinished blocks the event loop
                  so there is no time to draw when the QML is ready.

                  so I would try to use the
                  http://doc.qt.io/qt-5/qquickview.html#statusChanged

                  and if status is ready, then there in that slot i would run the QProcess.

                  In that way you first block the event loop when the
                  QML is 100% finished loading and that should work better.

                  1 Reply Last reply
                  1
                  • L Offline
                    L Offline
                    Lucian
                    wrote on last edited by
                    #12

                    Ok, i will try to find an example and i will post if i solve this.

                    1 Reply Last reply
                    0
                    • L Offline
                      L Offline
                      Lucian
                      wrote on last edited by
                      #13

                      Hey @mrjj

                      Can you give me one last hand of help ?:D
                      Look what i have done

                      class Process : public QObject
                      {
                          Q_OBJECT
                      private:
                          QProcess* proc = new QProcess(this);
                          QQuickView* view = new QQuickView();
                      
                      public slots:
                          void startProcess();
                      };
                      

                      In process.cpp

                      void Process::startProcess()
                      {
                          this->proc->start("C:\\Windows\\System32\\calc.exe", QIODevice::ReadWrite);
                          this->proc->waitForFinished(-1);
                      }
                      
                      void Process::run() {
                          view->setSource(QUrl("qrc:/loading.qml"));
                          view->setResizeMode(QQuickView::SizeRootObjectToView);
                          view->show();
                      
                          QObject::connect(view,SIGNAL(view::statusChanged),this, SLOT(Process::startProcess()));
                      }
                      

                      Now the qml is show correct but doesn't start the calc.exe after the qml is load.
                      Is corect how i use QObject::connect?

                      mrjjM 1 Reply Last reply
                      0
                      • L Lucian

                        Hey @mrjj

                        Can you give me one last hand of help ?:D
                        Look what i have done

                        class Process : public QObject
                        {
                            Q_OBJECT
                        private:
                            QProcess* proc = new QProcess(this);
                            QQuickView* view = new QQuickView();
                        
                        public slots:
                            void startProcess();
                        };
                        

                        In process.cpp

                        void Process::startProcess()
                        {
                            this->proc->start("C:\\Windows\\System32\\calc.exe", QIODevice::ReadWrite);
                            this->proc->waitForFinished(-1);
                        }
                        
                        void Process::run() {
                            view->setSource(QUrl("qrc:/loading.qml"));
                            view->setResizeMode(QQuickView::SizeRootObjectToView);
                            view->show();
                        
                            QObject::connect(view,SIGNAL(view::statusChanged),this, SLOT(Process::startProcess()));
                        }
                        

                        Now the qml is show correct but doesn't start the calc.exe after the qml is load.
                        Is corect how i use QObject::connect?

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

                        @Lucian said in Launch a second view on a pushed button:

                        Hi
                        Good work
                        There is a slight adjustment

                        QObject::connect(view,SIGNAL(view::statusChanged),this, SLOT(Process::startProcess()));

                        should be

                        QObject::connect(view,SIGNAL(statusChanged() ),this, SLOT(startProcess() ) );
                        ( no class:: in front when using the old syntax)

                        And i would love if you did

                        qDebug() << "status sig:" << QObject::connect(view,SIGNAL(statusChanged() ),this, SLOT(startProcess() ) );

                        so you can check it says TRUE;

                        Also
                        void Process::startProcess() {
                        qDebug() << "startProcess called";
                        ...

                        So we know it connects works and the startProcess is called.

                        1 Reply Last reply
                        0
                        • L Offline
                          L Offline
                          Lucian
                          wrote on last edited by Lucian
                          #15

                          Something is wrong.
                          It say : "status sig: false"
                          So the signal is not generated.

                          Also say:
                          QObject::connect: No such signal QQuickView::statusChanged()

                          mrjjM jsulmJ 2 Replies Last reply
                          0
                          • L Lucian

                            Something is wrong.
                            It say : "status sig: false"
                            So the signal is not generated.

                            Also say:
                            QObject::connect: No such signal QQuickView::statusChanged()

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

                            @Lucian
                            ahh sorry.
                            Didnt check the docs. ( shame on me)

                            its just missing the parameter.

                            void QQuickView::statusChanged(QQuickView::Status status)

                            so its
                            QObject::connect(view,SIGNAL(statusChanged(QQuickView::Status) ),this, SLOT(startProcess(QQuickView::Status) ) );

                            NOte. only Type is added. NOT the paramtername

                            and u need/could to change slot too

                            void Process::startProcess( QQuickView::Status thesatus) {
                            so here u can actually see if its ready etc.

                            but u dont need to use the status :)

                            1 Reply Last reply
                            0
                            • L Lucian

                              Something is wrong.
                              It say : "status sig: false"
                              So the signal is not generated.

                              Also say:
                              QObject::connect: No such signal QQuickView::statusChanged()

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

                              @Lucian
                              Please check documentation: http://doc.qt.io/qt-5/qquickview.html#statusChanged
                              The signal has a parameter, so it should be:

                              qDebug() << "status sig:" << QObject::connect(view,SIGNAL(statusChanged(QQuickView::Status) ),this, SLOT(startProcess() ) );
                              

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

                              1 Reply Last reply
                              1
                              • L Offline
                                L Offline
                                Lucian
                                wrote on last edited by Lucian
                                #18

                                Thanks @mrjj , @jsulm
                                Now it's better.
                                "status sig: true"

                                But the startProcess() still isn't call yet.
                                The message from slot is not printed and the calc.exe doesn't show up, but at lest the status from QQuickView is changed.

                                jsulmJ 1 Reply Last reply
                                0
                                • L Lucian

                                  Thanks @mrjj , @jsulm
                                  Now it's better.
                                  "status sig: true"

                                  But the startProcess() still isn't call yet.
                                  The message from slot is not printed and the calc.exe doesn't show up, but at lest the status from QQuickView is changed.

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

                                  @Lucian Try to connect first:

                                  void Process::run() {
                                      QObject::connect(view,SIGNAL(view::statusChanged),this, SLOT(Process::startProcess()));
                                      view->setSource(QUrl("qrc:/loading.qml"));
                                      view->setResizeMode(QQuickView::SizeRootObjectToView);
                                      view->show();
                                  }

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

                                  1 Reply Last reply
                                  0
                                  • L Offline
                                    L Offline
                                    Lucian
                                    wrote on last edited by
                                    #20

                                    Yes @jsulm .
                                    It work but this doesn't solve my problem.
                                    I try to connect status change with startProcess because the progress bar (loading.qml) was block by waitForFinish(-1).
                                    Now is happening the same.
                                    The signal and the slot are called in the right order but also loading.qml doesn't popup until i close the calc.exe.

                                    jsulmJ 1 Reply Last reply
                                    0
                                    • L Lucian

                                      Yes @jsulm .
                                      It work but this doesn't solve my problem.
                                      I try to connect status change with startProcess because the progress bar (loading.qml) was block by waitForFinish(-1).
                                      Now is happening the same.
                                      The signal and the slot are called in the right order but also loading.qml doesn't popup until i close the calc.exe.

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

                                      @Lucian Why do you wait for the process to finish?

                                      this->proc->waitForFinished(-1);
                                      

                                      Are you aware that this call blocks the event loop (so your app is blocked)?

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

                                      1 Reply Last reply
                                      0
                                      • L Offline
                                        L Offline
                                        Lucian
                                        wrote on last edited by Lucian
                                        #22

                                        Yes @jsulm .
                                        I need to do that because the process what will be launch will create a txt file. This file will be use farder so i need to be sore the process has finished his job and has created the txt.

                                        jsulmJ 1 Reply Last reply
                                        0
                                        • L Lucian

                                          Yes @jsulm .
                                          I need to do that because the process what will be launch will create a txt file. This file will be use farder so i need to be sore the process has finished his job and has created the txt.

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

                                          @Lucian No need to wait for this! Just connect to http://doc.qt.io/qt-5/qprocess.html#finished signal - when it is called the process has finished...
                                          Qt is an asynchronous framework - you should adapt to asynchronous programming.

                                          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