You want to be able to resize the pop-up list of a combo box. Normally, this pop-up list has always the same width as the combo box. However, in certain cases the width of the combo box needs to be fixed. But if the pop-up list does not expand itself, then only part of the items on the list is visible as illustrated here:
In this particular situation, the look of the pop-up list will be better if it can be resized independently from the combo box itself.
QComboBox unfortunately does not provide public functions to access its pop-up list. Also, the pop-up list widget itself is not accessible. It is possible to create a subclass of QComboBox
and reuse its private members (in header file qcombobox_p.h
), but this would have required a quite amount of effort.
By looking at the source of QComboBox
, we find out that the pop-up widget is QComboBoxPrivateContainer
. It is also constructed as a child widget of the combo box. Using run-time introspection feature of Qt, it is very easy to find this widget and change its size:
void resizeComboBoxPopup(QComboBox* comboBox, int width, int height) { if(!comboBox) return; // force the construction of QComboBoxViewContainer comboBox->view(); // iterate to find QComboBoxPrivateContainer QWidget* popup = 0; QObjectList objects = comboBox->children(); for(int i = 0; i < objects.size(); ++i) { QObject* obj = objects.at(i); if(obj->inherits("QComboBoxPrivateContainer")) popup = qobject_cast<qwidget>(obj); } if(popup) popup->resize(width, height); } </qwidget>
Of course, this cheap trick is only a workaround and only works as long as the implementation of QComboBox
does not change too much. It can also be considered as a crime to Qt. So, kids, don’t try this at home…