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?
QtWS25 Last Chance

[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 Offline
    B Offline
    beidaochuan
    wrote on 4 Jun 2015, 09:20 last edited by beidaochuan 6 Jul 2015, 08:22
    #1

    I made a qml element "ImageUser" and I want to make a ImageComboBox that its drop down items are ImageUser. how can i implement it?? (combobox has no delegate (cry))

    P 1 Reply Last reply 4 Jun 2015, 09:37
    0
    • B beidaochuan
      4 Jun 2015, 09:20

      I made a qml element "ImageUser" and I want to make a ImageComboBox that its drop down items are ImageUser. how can i implement it?? (combobox has no delegate (cry))

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

      @beidaochuan style ?

      157

      B 1 Reply Last reply 4 Jun 2015, 09:39
      0
      • P p3c0
        4 Jun 2015, 09:37

        @beidaochuan style ?

        B Offline
        B Offline
        beidaochuan
        wrote on 4 Jun 2015, 09:39 last edited by
        #3

        @p3c0
        can the style do what I want ?

        P 1 Reply Last reply 4 Jun 2015, 09:40
        0
        • 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

                                          8/22

                                          4 Jun 2015, 10:30

                                          14 unread
                                          • Login

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