Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Using components for the first time
Forum Updated to NodeBB v4.3 + New Features

Using components for the first time

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
12 Posts 3 Posters 2.5k 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.
  • sierdzioS sierdzio

    File Button.qml should start with a capital letter. Only such files are recognized by QML engine as Components.

    tomyT Offline
    tomyT Offline
    tomy
    wrote on last edited by
    #3

    @sierdzio
    Where should I make the first letter capital?
    I added this file to Resources by:
    Add New -> C++ source file -> Button.qml -> OK
    But in the Qt Creator it turned out to button.qml.
    I think no file in Qt creator is shown with a capital letter.

    1 Reply Last reply
    0
    • sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #4

      Hm, weird. But in your filesystem, the Button.qml starts with a capital letter, right?

      Open your QRC file in text editor and see if the name starts in upper case, too. Actually, maybe paste the QRC file here if you can, we'll see if it looks OK. QML engine should automatically pick it up if it is in the same folder as main.qml. But if the folder is different, you will need to import it.

      (Z(:^

      1 Reply Last reply
      0
      • tomyT Offline
        tomyT Offline
        tomy
        wrote on last edited by
        #5

        I've been working a little on Qt and seen the files in the Project view on the Qt creator. I have seen no file with a capital letter so far.

        Here is an image. What else is need I will post. Thanks.

        0_1504776411688_Capture.PNG

        1 Reply Last reply
        0
        • sierdzioS Offline
          sierdzioS Offline
          sierdzio
          Moderators
          wrote on last edited by
          #6

          Ah, Windows and it's case insensitiveness :-)

          Anyway, I see Qt Creator does recognize Rec with capital R, so it should also recognize the button. Rename it to Button.qml please (right click on button.qml and select rename). If it still does not work, open the QRC in text editor (right click -> open with -> plain text editor) and verify that it is capital letter.

          (Z(:^

          1 Reply Last reply
          2
          • tomyT Offline
            tomyT Offline
            tomy
            wrote on last edited by
            #7

            The file is Buttun now, but the prior error still exits.
            Did you think I'm using Linux?

            sierdzioS 1 Reply Last reply
            0
            • tomyT tomy

              The file is Buttun now, but the prior error still exits.
              Did you think I'm using Linux?

              sierdzioS Offline
              sierdzioS Offline
              sierdzio
              Moderators
              wrote on last edited by
              #8

              @tomy said in Using components for the first time:

              The file is Buttun now, but the prior error still exits.

              Do a full rebuild (clean, run qmake, rebuild). Perhaps the build system is not picking up the name change.

              Did you think I'm using Linux?

              No, I was not thinking about OS at all, to be honest :-)

              (Z(:^

              1 Reply Last reply
              1
              • tomyT Offline
                tomyT Offline
                tomy
                wrote on last edited by
                #9

                OK, and thank you. But I should make you aware that although I did the three but still that error!
                In the main.cpp we have this:

                if (engine.rootObjects().isEmpty())
                        return -1;
                

                Isn't it because of that? Because the error says: "Rec.exe exited with code -1".

                sierdzioS 1 Reply Last reply
                0
                • tomyT tomy

                  OK, and thank you. But I should make you aware that although I did the three but still that error!
                  In the main.cpp we have this:

                  if (engine.rootObjects().isEmpty())
                          return -1;
                  

                  Isn't it because of that? Because the error says: "Rec.exe exited with code -1".

                  sierdzioS Offline
                  sierdzioS Offline
                  sierdzio
                  Moderators
                  wrote on last edited by
                  #10

                  @tomy said in Using components for the first time:

                  OK, and thank you. But I should make you aware that although I did the three but still that error!
                  In the main.cpp we have this:

                  if (engine.rootObjects().isEmpty())
                          return -1;
                  

                  Isn't it because of that? Because the error says: "Rec.exe exited with code -1".

                  That is the result of error, not the cause. Engine's rootObjects are empty when there is an error in parsing / loading the QML code. In that case, the app will exit with -1 (and thus the operating system knows it was not a clean exit, but some error happened).

                  So, that code is good. Without it, the application would continue to run, but display an empty window. You can try commenting these 2 lines out to see that.

                  But I should make you aware that although I did the three but still that error!

                  Ah, silly me! I've got so focused on the naming issue that I have not checked your Button.qml code. It has an error (btw. Qt Creator should print QML errors for you): you use Button component inside Button.qml (in other words, Button tries to create Button inside, which tries to create Button inside etc.). There are several ways out of this problem:

                  • import QtQuick.Controls 2.0 in Button.qml, so the QML engine will use the built-in Button element inside your custom button
                  • remove Button from Button.qml, replace it with (for example) Text + MouseArea

                  (Z(:^

                  1 Reply Last reply
                  2
                  • tomyT Offline
                    tomyT Offline
                    tomy
                    wrote on last edited by tomy
                    #11

                    Thanks.

                    I used Button.qml this way: (as that section says)

                    // minimal API for a button
                    import QtQuick 2.5
                    
                    Item {
                        id: root
                        property alias text: label.text
                        signal clicked
                    
                       Rectangle {
                           id: rect
                        anchors.centerIn: parent
                        color: "lightsteelblue"
                        border.color: "slategrey"
                      }
                       Text {
                            id: label
                            anchors.centerIn: parent
                            text: "Start"
                        }
                    
                        MouseArea {
                            anchors.fill: parent
                            onClicked: root.clicked()
                        }
                    }
                    

                    And main.qml:

                    import QtQuick 2.6
                    import QtQuick.Window 2.2
                    
                    Window {
                        id: root
                        visible: true
                        width: 640
                        height: 480
                        title: qsTr("Rec")
                    
                       Button {
                           x: 450; y: 50
                           text: "First"
                           onClicked: status.text = "First Button clicked!"
                       }
                    
                       Button {
                           x: 450; y: 100
                           text: "Second"
                           onClicked: status.text = "Second Button clicked!"
                       }
                    
                       Button {
                           x: 450; y: 150
                           text: "Quit"
                           onClicked: close();
                       }
                    
                       Text {  // text changes when button was clicked
                           id: status
                           x: 450; y: 76
                           width: 116; height: 26
                           text: "waiting ..."
                           horizontalAlignment: Text.AlignHCenter
                       }
                    }
                    

                    When I run the program and click on either First, Second or Quit button, nothing happens. Why please?
                    And what is the usage of that Rectangle in Button.qml, please?

                    0_1504944725270_Capture.PNG

                    E 1 Reply Last reply
                    0
                    • tomyT tomy

                      Thanks.

                      I used Button.qml this way: (as that section says)

                      // minimal API for a button
                      import QtQuick 2.5
                      
                      Item {
                          id: root
                          property alias text: label.text
                          signal clicked
                      
                         Rectangle {
                             id: rect
                          anchors.centerIn: parent
                          color: "lightsteelblue"
                          border.color: "slategrey"
                        }
                         Text {
                              id: label
                              anchors.centerIn: parent
                              text: "Start"
                          }
                      
                          MouseArea {
                              anchors.fill: parent
                              onClicked: root.clicked()
                          }
                      }
                      

                      And main.qml:

                      import QtQuick 2.6
                      import QtQuick.Window 2.2
                      
                      Window {
                          id: root
                          visible: true
                          width: 640
                          height: 480
                          title: qsTr("Rec")
                      
                         Button {
                             x: 450; y: 50
                             text: "First"
                             onClicked: status.text = "First Button clicked!"
                         }
                      
                         Button {
                             x: 450; y: 100
                             text: "Second"
                             onClicked: status.text = "Second Button clicked!"
                         }
                      
                         Button {
                             x: 450; y: 150
                             text: "Quit"
                             onClicked: close();
                         }
                      
                         Text {  // text changes when button was clicked
                             id: status
                             x: 450; y: 76
                             width: 116; height: 26
                             text: "waiting ..."
                             horizontalAlignment: Text.AlignHCenter
                         }
                      }
                      

                      When I run the program and click on either First, Second or Quit button, nothing happens. Why please?
                      And what is the usage of that Rectangle in Button.qml, please?

                      0_1504944725270_Capture.PNG

                      E Offline
                      E Offline
                      Eeli K
                      wrote on last edited by
                      #12

                      @tomy I suggest avoiding existing Qt QML/Quick/Components type names to avoid possible problems. "Button" is already a type name in Components 1 and 2. Use MyButton.qml or something more descriptive. It may not matter here but can save you from some confusions and problems later.

                      This fixes your problem:

                      // minimal API for a button
                      import QtQuick 2.5
                      
                      Item {
                          id: root
                          property alias text: label.text
                          signal clicked
                          implicitHeight: 50
                          implicitWidth: 100
                          Rectangle {
                              id: rect
                              anchors.fill:parent
                              color: "lightsteelblue"
                              border.color: "slategrey"
                          }
                          Text {
                              id: label
                              anchors.centerIn: parent
                              text: "Start"
                          }
                      
                          MouseArea {
                              anchors.fill: parent
                              onClicked: root.clicked()
                          }
                      }
                      

                      The rectangle is just a backround so that you can define a color for your button. Item has only size and position but no visible appearance. I made the rectangle to fill the parent item. I also added size to your button. Otherwise you should set the height/width for them in your main.qml. In your version the button (i.e. the 'root' item) didn't have any size. Only the text inside the button had size but the item itself and the mouse area inside it were of size 0 x 0.

                      1 Reply Last reply
                      3

                      • Login

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