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. [solved]How can I customize ComboBox?

[solved]How can I customize ComboBox?

Scheduled Pinned Locked Moved QML and Qt Quick
comboboxcustomizeqmlqtquick
22 Posts 2 Posters 14.1k 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.
  • B beidaochuan
    4 Jun 2015, 09:39

    @p3c0
    can the style do what I want ?

    P Offline
    P Offline
    p3c0
    Moderators
    wrote on 4 Jun 2015, 09:40 last edited by
    #4

    @beidaochuan What do you want to do ? Can you provide a screenshot or some code sample ?

    157

    B 1 Reply Last reply 4 Jun 2015, 09:49
    0
    • P p3c0
      4 Jun 2015, 09:40

      @beidaochuan What do you want to do ? Can you provide a screenshot or some code sample ?

      B Offline
      B Offline
      beidaochuan
      wrote on 4 Jun 2015, 09:49 last edited by
      #5

      @p3c0
      i am sorry. could you tell me how i can upload a image.

      P 1 Reply Last reply 4 Jun 2015, 09:58
      0
      • B beidaochuan
        4 Jun 2015, 09:49

        @p3c0
        i am sorry. could you tell me how i can upload a image.

        P Offline
        P Offline
        p3c0
        Moderators
        wrote on 4 Jun 2015, 09:58 last edited by p3c0 6 Apr 2015, 09:58
        #6

        @beidaochuan Upload it to one of the image hosting sites like postimage.org or imgur.com or tinypic.com. Then after uploading there it will return a url. Post that url here directly or to embed it here use syntax ![Alt text](/path/to/img.jpg)

        157

        B 1 Reply Last reply 4 Jun 2015, 10:26
        0
        • P p3c0
          4 Jun 2015, 09:58

          @beidaochuan Upload it to one of the image hosting sites like postimage.org or imgur.com or tinypic.com. Then after uploading there it will return a url. Post that url here directly or to embed it here use syntax ![Alt text](/path/to/img.jpg)

          B Offline
          B Offline
          beidaochuan
          wrote on 4 Jun 2015, 10:26 last edited by p3c0 6 Apr 2015, 10:34
          #7

          @p3c0
          Thank you.
          usual combobox Alt text
          so i want to replace "banana/apple/coconut" with the qml element img

          P 1 Reply Last reply 4 Jun 2015, 10:30
          0
          • B beidaochuan
            4 Jun 2015, 10:26

            @p3c0
            Thank you.
            usual combobox Alt text
            so i want to replace "banana/apple/coconut" with the qml element img

            P Offline
            P Offline
            p3c0
            Moderators
            wrote on 4 Jun 2015, 10:30 last edited by
            #8

            @beidaochuan Still trying to understand. The image in the second link will be one of the item of ComboBox ?

            157

            B 1 Reply Last reply 4 Jun 2015, 10:34
            0
            • P p3c0
              4 Jun 2015, 10:30

              @beidaochuan Still trying to understand. The image in the second link will be one of the item of ComboBox ?

              B Offline
              B Offline
              beidaochuan
              wrote on 4 Jun 2015, 10:34 last edited by
              #9

              @p3c0
              yes. the second image is one of the items of combobox. In fact the second image is a qml element.

              P 2 Replies Last reply 4 Jun 2015, 10:42
              0
              • B beidaochuan
                4 Jun 2015, 10:34

                @p3c0
                yes. the second image is one of the items of combobox. In fact the second image is a qml element.

                P Offline
                P Offline
                p3c0
                Moderators
                wrote on 4 Jun 2015, 10:42 last edited by p3c0 6 Aug 2015, 11:33
                #10

                @beidaochuan Ok then to make your own custom dropdown. For now, you will need to implement your own dropdown style using __dropDownStyle private property inside ComboBoxStyle.

                157

                1 Reply Last reply
                0
                • B beidaochuan
                  4 Jun 2015, 10:34

                  @p3c0
                  yes. the second image is one of the items of combobox. In fact the second image is a qml element.

                  P Offline
                  P Offline
                  p3c0
                  Moderators
                  wrote on 4 Jun 2015, 10:54 last edited by p3c0 6 Apr 2015, 10:54
                  #11

                  @beidaochuan To explain here's an example:
                  main.qml

                  import QtQuick 2.4
                  import QtQuick.Controls 1.3
                  import QtQuick.Controls.Styles 1.3
                  
                  Item {
                      width: 250
                      height: 120
                  
                      ComboBox {
                          model: ListModel {
                              id: cbItems
                              ListElement { text: "Banana"; color: "Yellow" }
                              ListElement { text: "Apple"; color: "Green" }
                              ListElement { text: "Coconut"; color: "Brown" }
                          }
                          width: 200
                  
                          style: ComboBoxStyle {
                              id: comboBoxStyle
                              background: Rectangle {
                                  id: rect
                                  border.color: "red"
                                  color: "white"
                              }
                  
                              label: Text {
                                  color: "black"
                                  text: control.currentText
                              }
                  
                              __dropDownStyle: MenuStyle {
                                  frame: DropDownItem { }
                  
                                  itemDelegate.label: Text {
                                      color: styleData.selected ? "red" : "black"
                                      text: styleData.text
                                  }
                              }
                          }
                      }
                  }
                  

                  DropDownItem.qml

                  import QtQuick 2.4
                  
                  Rectangle {
                      color: "white"
                      border.width: 1
                      radius: 5
                      border.color: "gray"
                  }
                  

                  Now you can change DropDownItem as per your needs. I see you have some images in it. So you can use Image element inside DropDownItem.

                  157

                  B 2 Replies Last reply 4 Jun 2015, 11:09
                  0
                  • P p3c0
                    4 Jun 2015, 10:54

                    @beidaochuan To explain here's an example:
                    main.qml

                    import QtQuick 2.4
                    import QtQuick.Controls 1.3
                    import QtQuick.Controls.Styles 1.3
                    
                    Item {
                        width: 250
                        height: 120
                    
                        ComboBox {
                            model: ListModel {
                                id: cbItems
                                ListElement { text: "Banana"; color: "Yellow" }
                                ListElement { text: "Apple"; color: "Green" }
                                ListElement { text: "Coconut"; color: "Brown" }
                            }
                            width: 200
                    
                            style: ComboBoxStyle {
                                id: comboBoxStyle
                                background: Rectangle {
                                    id: rect
                                    border.color: "red"
                                    color: "white"
                                }
                    
                                label: Text {
                                    color: "black"
                                    text: control.currentText
                                }
                    
                                __dropDownStyle: MenuStyle {
                                    frame: DropDownItem { }
                    
                                    itemDelegate.label: Text {
                                        color: styleData.selected ? "red" : "black"
                                        text: styleData.text
                                    }
                                }
                            }
                        }
                    }
                    

                    DropDownItem.qml

                    import QtQuick 2.4
                    
                    Rectangle {
                        color: "white"
                        border.width: 1
                        radius: 5
                        border.color: "gray"
                    }
                    

                    Now you can change DropDownItem as per your needs. I see you have some images in it. So you can use Image element inside DropDownItem.

                    B Offline
                    B Offline
                    beidaochuan
                    wrote on 4 Jun 2015, 11:09 last edited by
                    #12

                    @p3c0
                    thank you for your apply.
                    I will try to do as you said.
                    have a nice day.

                    1 Reply Last reply
                    0
                    • P p3c0
                      4 Jun 2015, 10:54

                      @beidaochuan To explain here's an example:
                      main.qml

                      import QtQuick 2.4
                      import QtQuick.Controls 1.3
                      import QtQuick.Controls.Styles 1.3
                      
                      Item {
                          width: 250
                          height: 120
                      
                          ComboBox {
                              model: ListModel {
                                  id: cbItems
                                  ListElement { text: "Banana"; color: "Yellow" }
                                  ListElement { text: "Apple"; color: "Green" }
                                  ListElement { text: "Coconut"; color: "Brown" }
                              }
                              width: 200
                      
                              style: ComboBoxStyle {
                                  id: comboBoxStyle
                                  background: Rectangle {
                                      id: rect
                                      border.color: "red"
                                      color: "white"
                                  }
                      
                                  label: Text {
                                      color: "black"
                                      text: control.currentText
                                  }
                      
                                  __dropDownStyle: MenuStyle {
                                      frame: DropDownItem { }
                      
                                      itemDelegate.label: Text {
                                          color: styleData.selected ? "red" : "black"
                                          text: styleData.text
                                      }
                                  }
                              }
                          }
                      }
                      

                      DropDownItem.qml

                      import QtQuick 2.4
                      
                      Rectangle {
                          color: "white"
                          border.width: 1
                          radius: 5
                          border.color: "gray"
                      }
                      

                      Now you can change DropDownItem as per your needs. I see you have some images in it. So you can use Image element inside DropDownItem.

                      B Offline
                      B Offline
                      beidaochuan
                      wrote on 4 Jun 2015, 12:02 last edited by
                      #13

                      @p3c0
                      i did as you said, and modified the source as follows.

                      itemDelegate.background: IUserLevelImage{ userLevel: combx.currentIndex + 1}
                      frame: DropDownItem { }

                      And get the result like http://imgur.com/m4QW7c6
                      But I want to get the different background for banana , apple and coconut
                      what should i do?

                      P B 2 Replies Last reply 4 Jun 2015, 12:16
                      0
                      • B beidaochuan
                        4 Jun 2015, 12:02

                        @p3c0
                        i did as you said, and modified the source as follows.

                        itemDelegate.background: IUserLevelImage{ userLevel: combx.currentIndex + 1}
                        frame: DropDownItem { }

                        And get the result like http://imgur.com/m4QW7c6
                        But I want to get the different background for banana , apple and coconut
                        what should i do?

                        P Offline
                        P Offline
                        p3c0
                        Moderators
                        wrote on 4 Jun 2015, 12:16 last edited by p3c0 6 Apr 2015, 12:16
                        #14

                        @beidaochuan In that case use a Loader for itemDelegate.background and load the Components (in your case QML files) as per conditions. Each Component will contain individual styles.

                        itemDelegate.background: Loader {
                            source: if(styleData.text==="Coconut") {
                                        return "CoconutStyle.qml"
                                    } else if(styleData.text==="Banana") {
                                        return "BananaStyle.qml"
                                    } else if(styleData.text==="Apple") {
                                        return "AppleStyle.qml"
                                    }
                        }
                        

                        157

                        B 1 Reply Last reply 4 Jun 2015, 14:36
                        0
                        • B beidaochuan
                          4 Jun 2015, 12:02

                          @p3c0
                          i did as you said, and modified the source as follows.

                          itemDelegate.background: IUserLevelImage{ userLevel: combx.currentIndex + 1}
                          frame: DropDownItem { }

                          And get the result like http://imgur.com/m4QW7c6
                          But I want to get the different background for banana , apple and coconut
                          what should i do?

                          B Offline
                          B Offline
                          beidaochuan
                          wrote on 4 Jun 2015, 14:28 last edited by
                          #15
                          This post is deleted!
                          1 Reply Last reply
                          0
                          • P p3c0
                            4 Jun 2015, 12:16

                            @beidaochuan In that case use a Loader for itemDelegate.background and load the Components (in your case QML files) as per conditions. Each Component will contain individual styles.

                            itemDelegate.background: Loader {
                                source: if(styleData.text==="Coconut") {
                                            return "CoconutStyle.qml"
                                        } else if(styleData.text==="Banana") {
                                            return "BananaStyle.qml"
                                        } else if(styleData.text==="Apple") {
                                            return "AppleStyle.qml"
                                        }
                            }
                            
                            B Offline
                            B Offline
                            beidaochuan
                            wrote on 4 Jun 2015, 14:36 last edited by
                            #16

                            @p3c0
                            Thanks at first.
                            I am sorry that maybe I did not make the problem clear.
                            I want to implement a custom ComboBox whose items can be text , image, or object (***.qml).
                            So I think it would be common for all case.
                            Could you give me some advice?

                            P 1 Reply Last reply 4 Jun 2015, 16:54
                            0
                            • B beidaochuan
                              4 Jun 2015, 14:36

                              @p3c0
                              Thanks at first.
                              I am sorry that maybe I did not make the problem clear.
                              I want to implement a custom ComboBox whose items can be text , image, or object (***.qml).
                              So I think it would be common for all case.
                              Could you give me some advice?

                              P Offline
                              P Offline
                              p3c0
                              Moderators
                              wrote on 4 Jun 2015, 16:54 last edited by
                              #17

                              @beidaochuan You can put those components in respective QML files or Component and load it using Loader as shown in previous post.

                              157

                              B 2 Replies Last reply 5 Jun 2015, 00:45
                              0
                              • P p3c0
                                4 Jun 2015, 16:54

                                @beidaochuan You can put those components in respective QML files or Component and load it using Loader as shown in previous post.

                                B Offline
                                B Offline
                                beidaochuan
                                wrote on 5 Jun 2015, 00:45 last edited by p3c0 6 May 2015, 05:00
                                #18

                                @p3c0
                                I modified the code like:

                                //IComboBox
                                
                                import QtQuick 2.3
                                import QtQuick.Controls 1.3
                                import QtQuick.Controls.Styles 1.3
                                
                                Item {
                                    id: root
                                    width: 200
                                    height: 50
                                
                                    property alias comboBoxModel: combx.model
                                    property alias comboBoxStyleBackground: m_comboBoxStyle
                                    property alias dropDownMenuStyleframe: m_dropDownMenuStyleFrame
                                    signal indexChanged()
                                    property alias currentIndex: combx.currentIndex
                                    property alias currentText: combx.currentText
                                
                                    Rectangle {
                                        id: m_dropDownMenuStyleFrame
                                    }
                                
                                    Rectangle {
                                        id: m_comboBoxStyle
                                    }
                                
                                    ComboBox {
                                        id: combx
                                        model: ListModel {
                                            id: cbItems
                                        }
                                        width: 200
                                        height: 50
                                        style: ComboBoxStyle {
                                            id: comboBoxStyle
                                            background: m_comboBoxStyle
                                            label: Text {
                                                color: "black"
                                                width: 200
                                                height: 50
                                                text: control.currentText
                                            }
                                
                                            __dropDownStyle: MenuStyle {
                                                id: dropDownMenuStyle
                                                frame: dropDownMenuStyleFrame
                                                itemDelegate.label: Text {
                                                    width:200
                                                    height: 50
                                                    color: styleData.selected ? "blue" : "black"
                                                    text: styleData.text
                                                }
                                
                                                itemDelegate.background: Rectangle {
                                                    z: 1
                                                    opacity: 0.5
                                                    color: styleData.selected ? "darkGray" : "transparent"
                                                }
                                            }
                                        }
                                        onCurrentIndexChanged: {
                                            root.indexChanged()
                                        }
                                    }
                                }
                                

                                I use it in another my.qml,

                                // my.qml
                                import QtQuick 2.3
                                import QtQuick.Controls 1.3
                                import QtQuick.Controls.Styles 1.3
                                
                                IComboBox {
                                    id: root
                                    width: 200
                                    height: 50
                                
                                    property int m_userLevel: 1
                                    comboBoxModel: ListModel {
                                        id: cbItems
                                        ListElement { }
                                        ListElement { }
                                        ListElement { }
                                        ListElement { }
                                    }
                                    comboBoxStyleBackground: IUserLevelImage {
                                        userLevel: m_userLevel
                                    }
                                    dropDownMenuStyleframe: IUserLevelImage1 {
                                        id: items
                                    }
                                    onIndexChanged: {
                                        m_userLevel = currentIndex + 1
                                    }
                                }
                                

                                So an error happened.
                                Invalid property assignment: "dropDownMenuStyleframe" is a read-only property

                                Could yoy tell me the reason and how i can modified it ?

                                1 Reply Last reply
                                0
                                • P p3c0
                                  4 Jun 2015, 16:54

                                  @beidaochuan You can put those components in respective QML files or Component and load it using Loader as shown in previous post.

                                  B Offline
                                  B Offline
                                  beidaochuan
                                  wrote on 5 Jun 2015, 00:55 last edited by
                                  #19

                                  @p3c0
                                  By the way, how should i post the code using format?

                                  P 1 Reply Last reply 5 Jun 2015, 05:09
                                  0
                                  • B beidaochuan
                                    5 Jun 2015, 00:55

                                    @p3c0
                                    By the way, how should i post the code using format?

                                    P Offline
                                    P Offline
                                    p3c0
                                    Moderators
                                    wrote on 5 Jun 2015, 05:09 last edited by
                                    #20

                                    @beidaochuan That is because alias'es work with Component's properties and not with Components. More info here. The example should explain.
                                    Put your code after ``` (3 backticks) and end with the same. I have done it for you now.

                                    157

                                    B 1 Reply Last reply 6 Jun 2015, 15:09
                                    0
                                    • P p3c0
                                      5 Jun 2015, 05:09

                                      @beidaochuan That is because alias'es work with Component's properties and not with Components. More info here. The example should explain.
                                      Put your code after ``` (3 backticks) and end with the same. I have done it for you now.

                                      B Offline
                                      B Offline
                                      beidaochuan
                                      wrote on 6 Jun 2015, 15:09 last edited by beidaochuan 6 Jun 2015, 15:11
                                      #21

                                      @p3c0
                                      I modified the source as follows and I think it works well.

                                      //IComboBox
                                      import QtQuick 2.3
                                      import QtQuick.Controls 1.3
                                      import QtQuick.Controls.Styles 1.3
                                      
                                      ComboBox {
                                          id: root
                                          width: 200
                                          height: 50
                                      
                                          property alias comboBoxModel: root.model
                                          signal indexChanged()
                                          property alias currentIndex: root.currentIndex
                                          property alias currentText: root.currentText
                                      
                                          property Component comboBoxStyleBackground: Component { Rectangle{} }
                                          property Component dropDownMenuStyleFrame: Component { Rectangle{} }
                                      
                                          function setComboBoxStyleBackground(background) {
                                              comboBoxStyleBackground = background
                                          }
                                      
                                          function setDropDownMenuStyleFrame(frame) {
                                              dropDownMenuStyleFrame = frame
                                          }
                                      
                                          model: ListModel {
                                              id: cbItems
                                              ListElement { text: "" }
                                          }
                                      
                                          style: ComboBoxStyle {
                                              id: comboBoxStyle
                                              background: comboBoxStyleBackground
                                              label: Text {
                                                  color: "black"
                                                  width: root.width
                                                  height: root.height
                                                  text: control.currentText
                                              }
                                      
                                              __dropDownStyle: MenuStyle {
                                                  id: dropDownMenuStyle
                                                  frame: dropDownMenuStyleFrame
                                                  itemDelegate.label: Text {
                                                      width:root.width - 50
                                                      height: root.height
                                                      color: styleData.selected ? "blue" : "black"
                                                      text: styleData.text
                                                  }
                                      
                                                  itemDelegate.background: Rectangle {
                                                      z: 1
                                                      opacity: 0.5
                                                      color: styleData.selected ? "darkGray" : "transparent"
                                                  }
                                              }
                                          }
                                      
                                          onCurrentIndexChanged: {
                                              root.indexChanged()
                                          }
                                      }
                                      
                                      //MyComboBox
                                      import QtQuick 2.3
                                      import QtQuick.Controls 1.3
                                      import QtQuick.Controls.Styles 1.3
                                      
                                      IComboBox {
                                          id: root
                                          width: 200
                                          height: 50
                                      
                                          property int m_userLevel: 1
                                          comboBoxModel: ListModel {
                                              id: cbItems
                                              ListElement { text: "" }
                                              ListElement { text: "" }
                                              ListElement { text: "" }
                                              ListElement { text: "" }
                                          }
                                      
                                      
                                          Component {
                                              id: comboBoxStyleBackground
                                              IUserLevelImage {
                                                  anchors.fill: parent
                                                  userLevel: m_userLevel
                                              }
                                          }
                                      
                                      
                                          Component {
                                              id: dropDownMenuStyleFrame
                                              IUserLevelImage1 {
                                              }
                                          }
                                          onIndexChanged: {
                                              m_userLevel = currentIndex + 1
                                          }
                                          Component.onCompleted: {
                                              setComboBoxStyleBackground(comboBoxStyleBackground)
                                              setDropDownMenuStyleFrame(dropDownMenuStyleFrame)
                                          }
                                      }
                                      
                                      P 1 Reply Last reply 7 Jun 2015, 04:22
                                      0
                                      • B beidaochuan
                                        6 Jun 2015, 15:09

                                        @p3c0
                                        I modified the source as follows and I think it works well.

                                        //IComboBox
                                        import QtQuick 2.3
                                        import QtQuick.Controls 1.3
                                        import QtQuick.Controls.Styles 1.3
                                        
                                        ComboBox {
                                            id: root
                                            width: 200
                                            height: 50
                                        
                                            property alias comboBoxModel: root.model
                                            signal indexChanged()
                                            property alias currentIndex: root.currentIndex
                                            property alias currentText: root.currentText
                                        
                                            property Component comboBoxStyleBackground: Component { Rectangle{} }
                                            property Component dropDownMenuStyleFrame: Component { Rectangle{} }
                                        
                                            function setComboBoxStyleBackground(background) {
                                                comboBoxStyleBackground = background
                                            }
                                        
                                            function setDropDownMenuStyleFrame(frame) {
                                                dropDownMenuStyleFrame = frame
                                            }
                                        
                                            model: ListModel {
                                                id: cbItems
                                                ListElement { text: "" }
                                            }
                                        
                                            style: ComboBoxStyle {
                                                id: comboBoxStyle
                                                background: comboBoxStyleBackground
                                                label: Text {
                                                    color: "black"
                                                    width: root.width
                                                    height: root.height
                                                    text: control.currentText
                                                }
                                        
                                                __dropDownStyle: MenuStyle {
                                                    id: dropDownMenuStyle
                                                    frame: dropDownMenuStyleFrame
                                                    itemDelegate.label: Text {
                                                        width:root.width - 50
                                                        height: root.height
                                                        color: styleData.selected ? "blue" : "black"
                                                        text: styleData.text
                                                    }
                                        
                                                    itemDelegate.background: Rectangle {
                                                        z: 1
                                                        opacity: 0.5
                                                        color: styleData.selected ? "darkGray" : "transparent"
                                                    }
                                                }
                                            }
                                        
                                            onCurrentIndexChanged: {
                                                root.indexChanged()
                                            }
                                        }
                                        
                                        //MyComboBox
                                        import QtQuick 2.3
                                        import QtQuick.Controls 1.3
                                        import QtQuick.Controls.Styles 1.3
                                        
                                        IComboBox {
                                            id: root
                                            width: 200
                                            height: 50
                                        
                                            property int m_userLevel: 1
                                            comboBoxModel: ListModel {
                                                id: cbItems
                                                ListElement { text: "" }
                                                ListElement { text: "" }
                                                ListElement { text: "" }
                                                ListElement { text: "" }
                                            }
                                        
                                        
                                            Component {
                                                id: comboBoxStyleBackground
                                                IUserLevelImage {
                                                    anchors.fill: parent
                                                    userLevel: m_userLevel
                                                }
                                            }
                                        
                                        
                                            Component {
                                                id: dropDownMenuStyleFrame
                                                IUserLevelImage1 {
                                                }
                                            }
                                            onIndexChanged: {
                                                m_userLevel = currentIndex + 1
                                            }
                                            Component.onCompleted: {
                                                setComboBoxStyleBackground(comboBoxStyleBackground)
                                                setDropDownMenuStyleFrame(dropDownMenuStyleFrame)
                                            }
                                        }
                                        
                                        P Offline
                                        P Offline
                                        p3c0
                                        Moderators
                                        wrote on 7 Jun 2015, 04:22 last edited by
                                        #22

                                        @beidaochuan That's good :)
                                        If you are done, please mark the post as solved.

                                        157

                                        1 Reply Last reply
                                        0

                                        13/22

                                        4 Jun 2015, 12:02

                                        • Login

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