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

Using components for the first time

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
12 Posts 3 Posters 2.4k 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.
  • sierdzioS Offline
    sierdzioS Offline
    sierdzio
    Moderators
    wrote on last edited by
    #2

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

    (Z(:^

    tomyT 1 Reply Last reply
    3
    • 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