Как я могу переместить значок над текстом в QComboBox

Я некоторое время просматривал исходный файл QComboBox и не могу понять, что мне нужно изменить, чтобы значок располагался над текстом в QComboBox.

|-----------------------|
|         -----         |
|         |icn|         |
|         -----         |
|    Text label here    |
-------------------------

Метод рисования в QCombobox очень прост и ссылается на то, что называется QStyleOptionComboBox, но я не думаю, что хочу вносить здесь изменения, так как это повлияет на переносимость.

Не лучше ли мне изобрести что-то новое, чтобы действовать и вести себя как QComboBox?

Я должен был добавить, что я рассматриваю изменение как ListView, так и выбранного элемента, то есть части кнопки.


person aManFromOuterSpace    schedule 05.05.2014    source источник


Ответы (1)


Чтобы управлять положением значка (украшения) в раскрывающемся списке поля со списком, вам необходимо переопределить его параметры просмотра QAbstractItemView::viewOptions(). Давайте создадим собственное представление и заменим собственное представление поля со списком нашим:

class ComboView : public QListView
{
protected:
    QStyleOptionViewItem viewOptions() const
    {
        // Set icon on the top and center of combo box item.
        QStyleOptionViewItem option = QListView::viewOptions();
        option.decorationAlignment = Qt::AlignHCenter | Qt::AlignCenter;
        option.decorationPosition = QStyleOptionViewItem::Top;
        option.displayAlignment = Qt::AlignCenter;   
        return option;
    }
};

и для поля со списком:

QComboBox cb;
cb.setView(new ComboView); // Sets the custom view.
cb.addItem(QIcon("icon.png"), "Item1");
cb.addItem(QIcon("icon.png"), "Item2");
cb.show();
person vahancho    schedule 05.05.2014
comment
Вау, спасибо, это действительно хорошо работает для содержимого раскрывающегося списка, хотя это не влияет на выбранный элемент? Я могу только предположить, что те же параметры стиля могут быть применены к части кнопки QComboBox? - person aManFromOuterSpace; 05.05.2014
comment
@aManFromOuterSpace, теоретически да, но я не думаю, что это будет так же просто, как для выпадающего меню. Редактируемая часть должна быть строковым редактированием, поэтому я не уверен, что знаю, как ее изменить, не переопределяя событие paint() и т. д. - person vahancho; 05.05.2014
comment
Я думал, что QCombobox состоит из кнопки и всплывающего окна? Я буду продолжать изучать, как выровнять часть кнопки так же, как вы так любезно описали. - person aManFromOuterSpace; 05.05.2014
comment
Привет! Можешь мне помочь. Мне нужно скрыть текстовую метку элемента. Это возможно? - person Šerg; 23.11.2016
comment
@Šerg, что значит скрыть текстовую метку? Что, если вы просто установите пустую строку в качестве текста? - person vahancho; 23.11.2016