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. Show different qml ui from c++

Show different qml ui from c++

Scheduled Pinned Locked Moved Unsolved General and Desktop
c++qml
30 Posts 5 Posters 10.3k Views
  • 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.
  • F Offline
    F Offline
    firefox
    wrote on 18 Apr 2016, 05:56 last edited by
    #1

    Hi,

    I'm trying to make a application with qml UI and C++ backend.
    When I run the application login screen comes up which is main.qml in my project.

    I have another application.qml file which is the UI that should show up when login is successful.
    What is the best way to achieve this? I'm not sure how to proceed here.

    Thanks
    firefox

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mrjj
      Lifetime Qt Champion
      wrote on 18 Apr 2016, 07:39 last edited by
      #2

      Hi
      What about emit signal from the login screen to the c++ program if login is valid?
      Then c++ can show next QML file.
      http://wisol.ch/w/articles/2014-12-15-qt-signal-slots-qml-cpp/

      1 Reply Last reply
      0
      • F Offline
        F Offline
        firefox
        wrote on 18 Apr 2016, 08:57 last edited by
        #3

        HI mrji,

        I was trying to do that. My C++ class emits a signal if login is successful which is connected to a C++ slot which tries engine.load(path to new qml file). But it doesn't work. Is it correct way to show new qml UI?

        M 1 Reply Last reply 18 Apr 2016, 09:03
        0
        • F firefox
          18 Apr 2016, 08:57

          HI mrji,

          I was trying to do that. My C++ class emits a signal if login is successful which is connected to a C++ slot which tries engine.load(path to new qml file). But it doesn't work. Is it correct way to show new qml UI?

          M Offline
          M Offline
          mrjj
          Lifetime Qt Champion
          wrote on 18 Apr 2016, 09:03 last edited by
          #4

          @firefox
          Are u sure the slot is called ?

          Can engine.load return some status ?

          1 Reply Last reply
          0
          • F Offline
            F Offline
            firefox
            wrote on 18 Apr 2016, 09:17 last edited by
            #5

            This is my slot that gets called when login is succesful.

            void Login::showClient()
            {
                cout<<"trying to load client"<<endl;
                QQmlApplicationEngine engine;
                engine.load(QUrl(QStringLiteral("qrc:/BuddyList.qml")));
            
            }
            

            my cout statement gets printed that means slot is indeed getting called.
            Should I really be creating a new engine and load the qml file is there an elegant way of doing it?

            1 Reply Last reply
            0
            • J Offline
              J Offline
              jsulm
              Lifetime Qt Champion
              wrote on 18 Apr 2016, 09:20 last edited by
              #6

              engine is a local variable and gets destroyed when showClient() finishes.

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

              1 Reply Last reply
              1
              • M Offline
                M Offline
                mrjj
                Lifetime Qt Champion
                wrote on 18 Apr 2016, 09:20 last edited by
                #7

                @firefox said:
                well this seems wrong as
                QQmlApplicationEngine engine;
                is a local variable and will be deleted as soon as function ends.

                Cant you use the original engine that loads the login?

                1 Reply Last reply
                1
                • F Offline
                  F Offline
                  firefox
                  wrote on 18 Apr 2016, 10:21 last edited by firefox
                  #8

                  Thanks,

                  that was a brain fart on my side.
                  This is how my slot looks like now

                  void Login::showClient()
                  {
                      emit loginSuccessful();
                      cout<<"trying to load client"<<endl;
                      Q_ASSERT(engine);
                      engine->load(QUrl(QStringLiteral("qrc:/BuddyList.qml")));
                  }
                  

                  Now the problem is login.qml is still shown even after loading new qml file to same engine.
                  To overcome this, I added a new signal that is emitted when login is succesful that is picked by login.qml and set's it visible property to false.

                  But this seems like a hack and I'm guessing the login.qml instance still lingers around in memory. Do you guys suggest any better way to unload the login.qml from engine?

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on 18 Apr 2016, 10:29 last edited by
                    #9

                    Hi

                    • that was a brain fart on my side.
                      Its a classic fart :)

                    Im have not used QML so much to know if there is better way
                    and not sure how to unload using engine.

                    We can try to ask @Wieland ;)

                    1 Reply Last reply
                    0
                    • F Offline
                      F Offline
                      firefox
                      wrote on 18 Apr 2016, 11:00 last edited by
                      #10

                      @mrjj

                      Thanks mrjj.
                      I'm new to this forum. How to include @Wieland to this discussion? Will he be getting a notification if I @mention him.

                      M 1 Reply Last reply 18 Apr 2016, 11:14
                      0
                      • F firefox
                        18 Apr 2016, 11:00

                        @mrjj

                        Thanks mrjj.
                        I'm new to this forum. How to include @Wieland to this discussion? Will he be getting a notification if I @mention him.

                        M Offline
                        M Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on 18 Apr 2016, 11:14 last edited by
                        #11

                        @firefox
                        yes he will :)
                        Hopefully he dont mind :)

                        1 Reply Last reply
                        0
                        • ? Offline
                          ? Offline
                          A Former User
                          wrote on 18 Apr 2016, 23:09 last edited by
                          #12

                          Hi, I will look into this tomorrow, I promise!

                          1 Reply Last reply
                          1
                          • ? Offline
                            ? Offline
                            A Former User
                            wrote on 19 Apr 2016, 12:19 last edited by A Former User
                            #13

                            Ok, this is what I would do:

                            1. backend in C++, exposed to QtQuick
                            2. main.qml with the main application window
                            3. Login.qml with the login window
                            4. In main.cpp: use QQmlApplicationEngine and engine.load() to show main.qml as always
                            5. main.qml has its visible property set to false on startup
                            6. Login.qml is a Window from QtQuick.Window 2.0
                            7. main.qml has such a login window as a child
                            8. on startup the login window's visible property is set to true

                            -> on startup both the main window and the login window are loaded but only the login window is visible

                            1. the backend has one slot and two signals
                            2. the login window calls the backend's slot after the user has entered her password and clicked on a login button
                            3. the backend's slot takes the entered password as argument and checks if it's correct
                            4. if the password is correct the backend emits a "loginOk" signal, otherwise it emits a "loginFailed" signal
                            5. the login window has a slot connected to the backend's loginFailed signal. if it receives this signal it will tell the user to try it again

                            -> if password is wrong login window says "try again"

                            1. the main window has a slot connected to the backends loginOk signal
                            2. if it receives this signal it will make the login window invisible and make itself (the main window) visible

                            If you like the idea then I can post a working example.
                            Cheers!

                            1 Reply Last reply
                            3
                            • ? Offline
                              ? Offline
                              A Former User
                              wrote on 19 Apr 2016, 13:18 last edited by
                              #14

                              Oh, I forgot this: If you're really concerned about the memory the login window consumes then you can also create and destroy the login window dynamically from within main.qml.

                              1 Reply Last reply
                              1
                              • F Offline
                                F Offline
                                firefox
                                wrote on 19 Apr 2016, 16:47 last edited by
                                #15

                                @Wieland
                                Thank you. I like your idea. I'm new to qml but I'd like to try it out myself first and see if I can get it working.
                                I'd like to know about creating and destroying the login window dynamically. I think I would need it as the application is a chat client and I'd require to create and destroy chat windows.

                                ? 1 Reply Last reply 19 Apr 2016, 17:24
                                0
                                • F firefox
                                  19 Apr 2016, 16:47

                                  @Wieland
                                  Thank you. I like your idea. I'm new to qml but I'd like to try it out myself first and see if I can get it working.
                                  I'd like to know about creating and destroying the login window dynamically. I think I would need it as the application is a chat client and I'd require to create and destroy chat windows.

                                  ? Offline
                                  ? Offline
                                  A Former User
                                  wrote on 19 Apr 2016, 17:24 last edited by
                                  #16

                                  @firefox The official docs have the necessary info for dynamic creation / destruction, see: Dynamic QML Object Creation from JavaScript.

                                  kshegunovK 1 Reply Last reply 19 Apr 2016, 20:30
                                  0
                                  • ? A Former User
                                    19 Apr 2016, 17:24

                                    @firefox The official docs have the necessary info for dynamic creation / destruction, see: Dynamic QML Object Creation from JavaScript.

                                    kshegunovK Offline
                                    kshegunovK Offline
                                    kshegunov
                                    Moderators
                                    wrote on 19 Apr 2016, 20:30 last edited by kshegunov
                                    #17

                                    @Wieland
                                    Isn't this a fairly complex solution for quite the simple problem?
                                    (I'm not arguing about the solution itself, only pondering about QML)

                                    Read and abide by the Qt Code of Conduct

                                    1 Reply Last reply
                                    0
                                    • F Offline
                                      F Offline
                                      firefox
                                      wrote on 20 Apr 2016, 08:43 last edited by firefox
                                      #18

                                      @Wieland

                                      I created a login.qml and added it as child of main.qml and visible set to true
                                      main.qml has it's visible property set to false and when it receives loginSuccesful signal it's visible is set to true and login's visible is set to false.

                                      ApplicationWindow {
                                          id: mainClientId
                                          visible: false
                                          height: 640
                                          width:480
                                          minimumHeight: 500
                                          minimumWidth: 400
                                          color: "#cecece"
                                      
                                      
                                          Login {   //This is defined as window in Login.qml
                                              visible: true
                                              id: loginClientId
                                          }
                                      
                                      
                                          Connections {
                                              target: loginClass
                                              onLoginSuccessful: {
                                                  console.log("in Connections")
                                                  mainClientId.visible = true
                                                  loginClientId.visible = false
                                              }
                                      
                                          }
                                      }
                                      

                                      But since the parent's visible property is false, even login window doesn't show up when i run the application. Am I doing it right?

                                      @kshegunov what do you suggest here?

                                      kshegunovK 1 Reply Last reply 20 Apr 2016, 09:00
                                      0
                                      • F firefox
                                        20 Apr 2016, 08:43

                                        @Wieland

                                        I created a login.qml and added it as child of main.qml and visible set to true
                                        main.qml has it's visible property set to false and when it receives loginSuccesful signal it's visible is set to true and login's visible is set to false.

                                        ApplicationWindow {
                                            id: mainClientId
                                            visible: false
                                            height: 640
                                            width:480
                                            minimumHeight: 500
                                            minimumWidth: 400
                                            color: "#cecece"
                                        
                                        
                                            Login {   //This is defined as window in Login.qml
                                                visible: true
                                                id: loginClientId
                                            }
                                        
                                        
                                            Connections {
                                                target: loginClass
                                                onLoginSuccessful: {
                                                    console.log("in Connections")
                                                    mainClientId.visible = true
                                                    loginClientId.visible = false
                                                }
                                        
                                            }
                                        }
                                        

                                        But since the parent's visible property is false, even login window doesn't show up when i run the application. Am I doing it right?

                                        @kshegunov what do you suggest here?

                                        kshegunovK Offline
                                        kshegunovK Offline
                                        kshegunov
                                        Moderators
                                        wrote on 20 Apr 2016, 09:00 last edited by
                                        #19

                                        @firefox
                                        I don't work with QML, so I'm not suggesting anything. I was simply surprised it looks so complicated in QML (for the widgets module, which I use, what you're asking would be a two line snippet).

                                        Read and abide by the Qt Code of Conduct

                                        1 Reply Last reply
                                        0
                                        • F Offline
                                          F Offline
                                          firefox
                                          wrote on 20 Apr 2016, 09:33 last edited by
                                          #20

                                          Okay, Just realized the mistake.

                                          This is how main.qml looks now and it works.

                                          
                                          Item {
                                          
                                              Client {
                                                  id: clientId
                                                  visible:false
                                              }
                                          
                                              Login {
                                                  id: loginId
                                                  visible: true
                                              }
                                          
                                          
                                              Connections {
                                                  target: loginClass
                                                  onLoginSuccessful: {
                                                      console.log("in Connections")
                                                      clientId.visible = true
                                                      loginId.visible = false
                                                  }
                                          
                                              }
                                          }
                                          
                                          
                                          1 Reply Last reply
                                          0

                                          1/30

                                          18 Apr 2016, 05:56

                                          • Login

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