Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

How to change background qt quick controls 2 combobox ?



  • Hello all.
    I need help to change background color delegate of combobox.
    I tried change "Material.background" , but not change delegate background color(

    ComboBox
    {
        Material.background: "white"
        textRole: "key"
        model: ListModel
        {
            ListElement { key: "First"; value: 123 }
            ListElement { key: "Second"; value: 456 }
            ListElement { key: "Third"; value: 789 }
        }
    }
    

    Result:
    alt text
    alt text



  • @TheGringerEye
    You should customize the combo box control.
    refer this Customizing Combobox



  • @Mammamia I tried this, but were lost Material Design Effects such as Waves, ElevatorEffect and other.



  • @TheGringerEye said in How to change background qt quick controls 2 combobox ?:

    @Mammamia I tried this, but were lost Material Design Effects such as Waves, ElevatorEffect and other.

    I believe it shouldn't happen if you if replace only the delegate and not background etc.

    ComboBox {
    id: control
    delegate: MenuItem {
            width: control.popup.width
            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
            Material.foreground: control.currentIndex === index ? control.popup.Material.accent : control.popup.Material.foreground
            highlighted: control.highlightedIndex === index
            hoverEnabled: control.hoverEnabled
        }
    }
    

    Here the delegate is copied from my Qt installation Qt/5.8/[compilerversion]/qml/QtQuick/Controls.2/Material/ComboBox.qml. Try adding Material.background to the delegate.



  • @Eeli-K Not working :(


  • Qt Champions 2016

    @TheGringerEye here's my custom combo box
    perhaps gives you some ideas.
    ComboBoxWithIcon.qml:

    // this custom ComboBox works using a JS datamodel where the model is something like this:
    // [{"imageName":"download.png", "itemText":qsTr("Download")}, ...]
    // using same model as a QML ListModel you must change the delegate: model.imageName
    // and contentItem: listModel.get(comboBox.currentIndex).imageName
    ComboBox {
        id: comboBox
        focusPolicy: Qt.NoFocus
        property bool containsInvalidItems: false
    
        delegate: ItemDelegate {
                    width: comboBox.width
                    Material.foreground: comboBox.currentIndex === index ? comboBox.Material.accent : comboBox.Material.foreground
                    highlighted: comboBox.highlightedIndex === index
                    contentItem: Row {
                        spacing: 6
                        IconInactive {
                            imageName: modelData.imageName
                        }
                        LabelSubheading {
                            text: modelData.itemText
                            anchors.verticalCenter: parent.verticalCenter
                            font.strikeout: comboBox.containsInvalidItems && modelData.invalidItem
                        }
                    }
                }
    
        contentItem:
            Row {
            // need some space to see the indicator
            // need some extra space for the rows to display Icon and text if displayText is used
            rightPadding: comboBox.displayText.length? 24+16 : 16
            spacing: 6
            IconInactive {
                visible: !comboBox.displayText.length
                imageName: comboBox.model[comboBox.currentIndex].imageName
            }
            LabelSubheading {
                text: comboBox.displayText.length? comboBox.displayText : comboBox.model[comboBox.currentIndex].itemText
                anchors.verticalCenter: parent.verticalCenter
                font.strikeout: comboBox.displayText.length? false : comboBox.containsInvalidItems && comboBox.model[comboBox.currentIndex].invalidItem
            }
        } // row
    }
    

    and here's how I'm using this ComboBox:

    ComboBoxWithIcon {
        id: selectToursDropDown
        Layout.leftMargin: 6
        Layout.rightMargin: 6
        displayText: qsTr("Tour selection")
        model: [
            {"imageName":"schedule_my.png", "itemText":qsTr("Show my")},
            {"imageName":"schedule.png", "itemText":qsTr("Show all")},
            {"imageName":"directions.png", "itemText":qsTr("Transfer")},
            {"imageName":"download.png", "itemText":qsTr("Download")}
        ]
        onCurrentIndexChanged: {
            // do something
        }
    }
    

    LabelSubheading and IconInactive itself are also customized controls.
    Take a look at my sample apps at github https://appbus.wordpress.com/category/qt-for-mobile/overview/



  • @TheGringerEye If the given examples don't work, you have to give more information. How the comboboxes are coded, created and used? Can you replicate the problem with a minimal app, created with the Qt Creator's wizard, where the combobox and the using code is in main.qml?



  • Hi! Have a look at ComboBox.qml to see how the default implementation works. Should be easy to modify it to fit your needs.



  • @Eeli-K Background dont changed



  • @TheGringerEye So you want to change both the contentItem's and delegate's background to white? Can you paste the minimal app here?


Log in to reply