QComboBox не так прост для понимания и следует его поизучать исходники .
Выясняется , что QComboBox реализует по умолчанию модель данных QStandartItemModel, которую при желании можно заменить на другую собственную реализацию.
QStandartItemModel на самом деле позволяет использовать такие роли как TextColor, Decoration, BackgroundColor и т.д., то есть вы можете штатно изменить цвет текста отдельных элементов списка, добавить иконки и т.д.
QComboBox перехватывает события мышки, фокуса и т.д. как любой порядочный виджет, чтобы отрисовать себя в разных вариантах. Вы можете переопределить метод paint у QComboBox и отрисовывать себя как угодно.
У комбобокса на первый взгляд нет многих полезных фишек, которые хотелось бы добавить (как это знакомо всем).
Что мы делаем - это переопределяем сам
QComboBox и (или) его модель данных QStandartItemModel.
Для того чтобы изменить отрисовку смотрим и делаем аналогично тому как это делает сам комбобокс, далее реализуем делегат и управляем отображением по новому. Делегат также позволяет реализовать и сам выпадающий список с новым поведением, отображением и т.д.
Вы можете полностью заменить модель данных на свою написав полностью с нуля, унаследовавшись от абстрактного класса.
Если надо поменять цвет QComboBox
Итак поменять цвет самого QComboBox (а не виджета выпадающего списка) всегда можно через setStyleSheet (примерно так):
ui->cmb_kkts->setStyleSheet( "FineComboBox{ background-color:#ff4444;\n"\
"color: #ffffff;}\n"\
);
Поменять цвет элементов выпадающего списка
Тут имеется ввиду индивидуально устанавливать элементам списка цвет текста например. В этом случае надо задействовать модель данных, по умолчанию QStandartItemModel для QComboBox.
Все что надо это использовать setData с указанием роли TextColor и все будет работать из коробки (без велосипеда)
Небольшие замечания
currentIndexChanged
По поводу выпуска сигнала currentIndexChanged. Странно, но открывая комбобокс для выбора элемента из списка сначала выпускается с currentIndexChanged индексом 0, что означает что индекс установился на позицию 0. И это логично, так как ее надо куда-то изначально установить (в открывшемся списке). И второй раз currentIndexChanged сработает, если вы выберите другую, отличную от 0 позицию в списке (и закроет выпавший список).
activated
Можно попробовать использовать сигнал activated. Но от тоже вызывается два раза, но одним отличием при открытии списка первый сигнал activated с индексом не 0, а с индексом текущего выбранного значения. второй выпуск с индексов уже выбранного нового значения. Но теперь старое и новое значение уже можно сравнивать.
Минусом теперь будет, что вызов setCurrentIndex не вызывает activated, то есть activated надо теперь не забывать где нужно программно вызывать вручную.