Search code examples
c++qtlistviewstylesheetqcombobox

QComboBox ListView is occuping combobox frame


the comboBox contains two entries and , when the combobox is clicked, the listview occupies the frame of combobox. I want the list view just below the combobox. stylesheet is as shown below:

QComboBox {
border: 1px solid #8F9EAB;
border-radius: 3px;
font: 16pt "Arial";
min-width: 6em;
color: #1B3067;
background-color: rgb(255, 255, 255);
padding-left:10px;
} 
QComboBox:pressed
{
border: 1px solid #1562AD; 
color: rgb(255, 255, 255);
background-color: #87A6D5;
} 
QComboBox:disabled
{
border: 1px solid #BFBFBF; 
color: #BFBFBF;
background-color: rgb(255, 255, 255);
} 
QComboBox::down-arrow
{ 
background-image: url(:/Images/data/img/Images/DOWN_enabled.png);
height: 7px;
width : 13px;
}
QComboBox::drop-down 
{ 
subcontrol-position: top right;
width: 40px;
color: white;
border-left-width: 0px;
border-left-color: #8F9EAB;
border-left-style: solid; 
border-top-right-radius: 3px;
border-bottom-right-radius: 3px; 
}
QComboBox QListView
{
font: 16pt "Arial";
color: rgb(80, 80, 80);
}
QComboBox QAbstractItemView::item 
{
border-bottom: 5px solid white; margin:3px;
}

Solution

  • The position of the view() can not be handled with Qt Style Sheet, you must create a class that inherits from QComboBox and overwrite the showPopup() method as shown below.

    class ComboBox: public QComboBox{
    public:
        using QComboBox::QComboBox;
    public:
        void showPopup(){
            QComboBox::showPopup();
            QPoint pos = mapToGlobal(QPoint(0, height()));
            view()->parentWidget()->move(pos);
        }
    };
    

    enter image description here