This gist was moved to:
https://github.com/EXL/Stuff/tree/master/Examples/Qt-GradientComboBox
This gist was moved to:
https://github.com/EXL/Stuff/tree/master/Examples/Qt-GradientComboBox
#------------------------------------------------- | |
# | |
# Project created by QtCreator 2014-08-29T17:55:26 | |
# | |
#------------------------------------------------- | |
QT += core gui | |
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets | |
TARGET = GradientComboBox | |
TEMPLATE = app | |
SOURCES += main.cpp\ | |
MainWindow.cpp | |
HEADERS += MainWindow.h | |
FORMS += MainWindow.ui |
#include "MainWindow.h" | |
#include <QApplication> | |
int main(int argc, char *argv[]) | |
{ | |
QApplication a(argc, argv); | |
MainWindow w; | |
w.show(); | |
return a.exec(); | |
} |
#include "MainWindow.h" | |
#include "ui_MainWindow.h" | |
MainWindow::MainWindow(QWidget *parent) : | |
QMainWindow(parent), | |
ui(new Ui::MainWindow) | |
{ | |
ui->setupUi(this); | |
initializeComboBox(); | |
colorizeComboBox(ui->comboBox, Qt::green, Qt::red, Qt::yellow); | |
} | |
void MainWindow::initializeComboBox() | |
{ | |
const int n = 50; | |
for (size_t i = 0; i <= n; ++i) { | |
ui->comboBox->insertItem(i, QString::number(getValue(i), 'f', 2)); | |
// ui->comboBox->setItemData(i, colorGenerator(Qt::green, Qt::red, i, n), Qt::BackgroundRole); | |
} | |
} | |
qreal MainWindow::getValue(int aStep) | |
{ | |
return (qreal) aStep / 10; | |
} | |
QColor MainWindow::colorGenerator(QColor aBegin, QColor aEnd, int aStep, int aSize) const | |
{ | |
qreal rB, gB, bB; | |
qreal rE, gE, bE; | |
aBegin.getRgbF(&rB, &gB, &bB); | |
aEnd.getRgbF(&rE, &gE, &bE); | |
QColor color; | |
color.setRgbF(colorInterpolate(rB, rE, aStep, aSize), | |
colorInterpolate(gB, gE, aStep, aSize), | |
colorInterpolate(bB, bE, aStep, aSize)); | |
return color; | |
} | |
void MainWindow::colorizeComboBox(QComboBox *aComboBox, QColor aBegin, QColor aEnd, QColor aMiddle) | |
{ | |
int _size = aComboBox->count(); | |
int _middle = _size / 2; | |
qreal rB, gB, bB; | |
qreal rE, gE, bE; | |
qreal rM, gM, bM; | |
aBegin.getRgbF(&rB, &gB, &bB); | |
aEnd.getRgbF(&rE, &gE, &bE); | |
aMiddle.getRgbF(&rM, &gM, &bM); | |
for (int i = 0; i < _size; ++i) { | |
QColor color; | |
if (aMiddle != Qt::transparent) { | |
if (i < _middle) { | |
color.setRgbF(colorInterpolate(rB, rM, i, _middle), | |
colorInterpolate(gB, gM, i, _middle), | |
colorInterpolate(bB, bM, i, _middle)); | |
} else { | |
color.setRgbF(colorInterpolate(rM, rE, i - _middle, _middle), | |
colorInterpolate(gM, gE, i - _middle, _middle), | |
colorInterpolate(bM, bE, i - _middle, _middle)); | |
} | |
} else { | |
color.setRgbF(colorInterpolate(rB, rE, i, _size), | |
colorInterpolate(gB, gE, i, _size), | |
colorInterpolate(bB, bE, i, _size)); | |
} | |
aComboBox->setItemData(i, color, Qt::BackgroundRole); | |
} | |
} | |
qreal MainWindow::colorInterpolate(qreal aBegin, qreal aEnd, int aStep, int aSize) const | |
{ | |
return (aBegin < aEnd) ? qAbs(((aEnd - aBegin) * ((qreal) aStep / aSize)) + aBegin) : | |
qAbs(((aBegin - aEnd) * (1 - ((qreal) aStep / aSize))) + aEnd); | |
} | |
MainWindow::~MainWindow() | |
{ | |
delete ui; | |
} |
#ifndef MAINWINDOW_H | |
#define MAINWINDOW_H | |
#include <QMainWindow> | |
namespace Ui { | |
class MainWindow; | |
} | |
class QComboBox; | |
class MainWindow : public QMainWindow | |
{ | |
Q_OBJECT | |
public: | |
explicit MainWindow(QWidget *parent = 0); | |
~MainWindow(); | |
private: | |
void initializeComboBox(); | |
qreal getValue(int aStep); | |
QColor colorGenerator(QColor aBegin, QColor aEnd, int aStep, int aSize) const; | |
void colorizeComboBox(QComboBox *aComboBox, QColor aBegin, QColor aEnd, QColor aMiddle = Qt::transparent); | |
qreal colorInterpolate(qreal aBegin, qreal aEnd, int aStep, int aSize) const; | |
private: | |
Ui::MainWindow *ui; | |
}; | |
#endif // MAINWINDOW_H |
<?xml version="1.0" encoding="UTF-8"?> | |
<ui version="4.0"> | |
<class>MainWindow</class> | |
<widget class="QMainWindow" name="MainWindow"> | |
<property name="geometry"> | |
<rect> | |
<x>0</x> | |
<y>0</y> | |
<width>400</width> | |
<height>300</height> | |
</rect> | |
</property> | |
<property name="windowTitle"> | |
<string>MainWindow</string> | |
</property> | |
<widget class="QWidget" name="centralWidget"> | |
<layout class="QVBoxLayout" name="verticalLayout"> | |
<item> | |
<layout class="QGridLayout" name="gridLayout"> | |
<item row="0" column="1"> | |
<spacer name="verticalSpacer"> | |
<property name="orientation"> | |
<enum>Qt::Vertical</enum> | |
</property> | |
<property name="sizeHint" stdset="0"> | |
<size> | |
<width>20</width> | |
<height>40</height> | |
</size> | |
</property> | |
</spacer> | |
</item> | |
<item row="1" column="0"> | |
<spacer name="horizontalSpacer"> | |
<property name="orientation"> | |
<enum>Qt::Horizontal</enum> | |
</property> | |
<property name="sizeHint" stdset="0"> | |
<size> | |
<width>40</width> | |
<height>20</height> | |
</size> | |
</property> | |
</spacer> | |
</item> | |
<item row="1" column="1"> | |
<widget class="QComboBox" name="comboBox"> | |
<property name="minimumSize"> | |
<size> | |
<width>120</width> | |
<height>0</height> | |
</size> | |
</property> | |
</widget> | |
</item> | |
<item row="1" column="2"> | |
<spacer name="horizontalSpacer_2"> | |
<property name="orientation"> | |
<enum>Qt::Horizontal</enum> | |
</property> | |
<property name="sizeHint" stdset="0"> | |
<size> | |
<width>40</width> | |
<height>20</height> | |
</size> | |
</property> | |
</spacer> | |
</item> | |
<item row="2" column="1"> | |
<spacer name="verticalSpacer_2"> | |
<property name="orientation"> | |
<enum>Qt::Vertical</enum> | |
</property> | |
<property name="sizeHint" stdset="0"> | |
<size> | |
<width>20</width> | |
<height>40</height> | |
</size> | |
</property> | |
</spacer> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</widget> | |
</widget> | |
<layoutdefault spacing="6" margin="11"/> | |
<resources/> | |
<connections/> | |
</ui> |