QComboBox

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 надо теперь не забывать где нужно программно вызывать вручную.