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.
  • 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

                              18/22

                              5 Jun 2015, 00:45

                              • Login

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