Russian Qt Forum
Ноябрь 23, 2024, 15:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Color ComboBox  (Прочитано 10908 раз)
aliks-os
Гость
« : Май 20, 2011, 11:53 »

Приветствую всех.
Как то понадобился мне выбор цвета из ComboBox. Готового решения не нашел, пришлось писать самому, все довольно таки просто. Может кому то понадобиться.
Код:
    QComboBox *comboBox = new QComboBox(this);
    QStringList colorNames;
    //colorNames = QColor::colorNames();   //Если нужны ВСЕ цвета, присутствущие в системе, разремируем данную строчку и ремируем следующую. Иначе, используем только те цвета, которые указаны строчкой ниже
    colorNames <<"darkGreen"<<"green"<<"gray"<<"red"<<"white"<<"blue"<<"cyan"<<"darkMagenta"<<"yellow"<<"darkRed"<<"black"<<"magenta";

    comboBox ->setFocusPolicy(Qt::NoFocus);
    int size = comboBox ->style()->pixelMetric(QStyle::PM_SmallIconSize);
    QPixmap pixmap(size,size-5);

    int con=0;
    foreach (const QString &colorName, colorNames) {
        comboBox ->addItem(colorName);  //Добавляем название цветов
        pixmap.fill(QColor(colorName));

        QRect rBorder(0,0,size-1,size-6);
        QPainter p(&pixmap);
        QPen pen(Qt::lightGray, 1, Qt::SolidLine);
        p.setPen(pen);
        p.drawRect(rBorder);

        comboBox->setItemData(con, pixmap, Qt::DecorationRole);//Добавляем изображение цвета в комбо
        con=con+1;
    }
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 20, 2011, 12:01 »

QStringList QColor::colorNames () [static]
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Май 20, 2011, 12:08 »

Цитировать
Готового решения не нашел, пришлось писать самому, все довольно таки просто.
И зря - всё уже написано. См. Color Editor Factory Example в ассистенте.
И увидишь, что если для Qt::DecorationRole передавать QColor, то Qt всё сама сделает)
Записан

Qt 5.11/4.8.7 (X11/Win)
aliks-os
Гость
« Ответ #3 : Май 20, 2011, 12:28 »

Цитировать
Готового решения не нашел, пришлось писать самому, все довольно таки просто.
И зря - всё уже написано. См. Color Editor Factory Example в ассистенте.
И увидишь, что если для Qt::DecorationRole передавать QColor, то Qt всё сама сделает)

Воспроизводил уже это...в нем когда ComboBox закрыт, цвет не отображается
Записан
aliks-os
Гость
« Ответ #4 : Май 20, 2011, 12:29 »

QStringList QColor::colorNames () [static]

Спасибо за подсказку
Записан
asg128
Гость
« Ответ #5 : Сентябрь 23, 2011, 08:23 »

Спасибо за код!
После оформления его в виде класса-наследника QComboBox с добавлением свойства color, получился удобный виджет.
Записан
AlexMad
Гость
« Ответ #6 : Январь 16, 2012, 00:33 »

А вот у меня немного странный вопрос (Может, я не дочитал документацию). Как мне получить цвет при выборе, при условии, что текстовое поле я не заполняю.
Т.е. вместо
Код:
ui.comboBox_Col_1Y->addItem(colorName, color);
у меня
Код:
ui.comboBox_Col_1Y->addItem("", color);
Связано это с тем, что у меня просто нет места на форме для отображения текста. Нужна только иконка.
Повторюсь - может, я не дочитал доку, но пока у меня в голове крутятся два не очень красивых варианта:
1. Дешево и сердито. Смотреть цвет пикселя иконки. Не уверен, что это легко, тем более не уверен, что это красиво.
2. Создать дополнительное свойство для Item в ComboBox, несущее информацию о цвете. Может и красиво, но, думаю, уже давно реализовано проще и лучше.

Задача достаточно проста - нужно выбрать цвета для 30 и более графиков. На форме просто не влезет столько ComboBoxов, если им дать место для вывода названия цвета, а при малом их размере видны только первые полторы буквы, что не очень красиво.

Думал, что addItem("", color) добавляет не только текст, но и некое доп. свойство (color). Но при попытке его получить
Код:
QColor curColor = qVariantValue<QColor>(ui.comboBox->itemData(ui.comboBox->currentIndex(), Qt::DecorationRole));
Получаю цвет только в том случае, если текстовое поле не было пустым и обозначало цвет.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Январь 16, 2012, 00:43 »

да, второй вариант уже придуман разработчиками библиотеки: QComboBox::setItemData ( int index, const QVariant & value, int role = Qt::UserRole )
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
AlexMad
Гость
« Ответ #8 : Январь 16, 2012, 01:04 »

да, второй вариант уже придуман разработчиками библиотеки: QComboBox::setItemData ( int index, const QVariant & value, int role = Qt::UserRole )
В эту сторону копал, но сбился на предложенном выше
Код:
comboBox->setItemData(con, pixmap, Qt::DecorationRole);//Добавляем изображение цвета в комбо
То есть, могу ли я одновременно добавить и иконку (без нее не будет понятно, какой цвет выбран), и доп. свойство <color>?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Январь 16, 2012, 01:40 »

а, так тебе надо было просто использовать UserRole вместо DecorationRole для получения цвета.

ещё есть метод добавления иконки и своих данных одновременно, вместо setItemData: QComboBox::addItem ( const QIcon & icon, const QString & text, const QVariant & userData = QVariant() ). а пустой текст лучше задавай через QString(), а не "".
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Январь 16, 2012, 10:33 »

А вот у меня немного странный вопрос (Может, я не дочитал документацию). Как мне получить цвет при выборе, при условии, что текстовое поле я не заполняю.

Код:
QColor curColor = qVariantValue<QColor>(ui.comboBox->itemData(ui.comboBox->currentIndex(), Qt::DecorationRole));
Получаю цвет только в том случае, если текстовое поле не было пустым и обозначало цвет.
См. готовый вариант [http://www.prog.org.ru/index.php?topic=19455.msg131386#msg131386]здес
Записан

Qt 5.11/4.8.7 (X11/Win)
AlexMad
Гость
« Ответ #11 : Январь 16, 2012, 11:45 »

а, так тебе надо было просто использовать UserRole вместо DecorationRole для получения цвета.

Вот!!! Именно то, что искал. Спасибо!!!
Записан
popper
Гость
« Ответ #12 : Январь 16, 2012, 14:24 »

AlexMad, в библиотеке QSint есть еще интересные виджеты для выбора цвета.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 23.