Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: aliks-os от Май 20, 2011, 11:53



Название: Color ComboBox
Отправлено: 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;
    }


Название: Re: Color ComboBox
Отправлено: Пантер от Май 20, 2011, 12:01
QStringList QColor::colorNames () [static]


Название: Re: Color ComboBox
Отправлено: GreatSnake от Май 20, 2011, 12:08
Цитировать
Готового решения не нашел, пришлось писать самому, все довольно таки просто.
И зря - всё уже написано. См. Color Editor Factory Example в ассистенте.
И увидишь, что если для Qt::DecorationRole передавать QColor, то Qt всё сама сделает)


Название: Re: Color ComboBox
Отправлено: aliks-os от Май 20, 2011, 12:28
Цитировать
Готового решения не нашел, пришлось писать самому, все довольно таки просто.
И зря - всё уже написано. См. Color Editor Factory Example в ассистенте.
И увидишь, что если для Qt::DecorationRole передавать QColor, то Qt всё сама сделает)

Воспроизводил уже это...в нем когда ComboBox закрыт, цвет не отображается


Название: Re: Color ComboBox
Отправлено: aliks-os от Май 20, 2011, 12:29
QStringList QColor::colorNames () [static]

Спасибо за подсказку


Название: Re: Color ComboBox
Отправлено: asg128 от Сентябрь 23, 2011, 08:23
Спасибо за код!
После оформления его в виде класса-наследника QComboBox с добавлением свойства color, получился удобный виджет.


Название: Re: Color ComboBox
Отправлено: AlexMad от Январь 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));
Получаю цвет только в том случае, если текстовое поле не было пустым и обозначало цвет.


Название: Re: Color ComboBox
Отправлено: kambala от Январь 16, 2012, 00:43
да, второй вариант уже придуман разработчиками библиотеки: QComboBox::setItemData ( int index, const QVariant & value, int role = Qt::UserRole )


Название: Re: Color ComboBox
Отправлено: AlexMad от Январь 16, 2012, 01:04
да, второй вариант уже придуман разработчиками библиотеки: QComboBox::setItemData ( int index, const QVariant & value, int role = Qt::UserRole )
В эту сторону копал, но сбился на предложенном выше
Код:
comboBox->setItemData(con, pixmap, Qt::DecorationRole);//Добавляем изображение цвета в комбо
То есть, могу ли я одновременно добавить и иконку (без нее не будет понятно, какой цвет выбран), и доп. свойство <color>?


Название: Re: Color ComboBox
Отправлено: kambala от Январь 16, 2012, 01:40
а, так тебе надо было просто использовать UserRole вместо DecorationRole для получения цвета.

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


Название: Re: Color ComboBox
Отправлено: GreatSnake от Январь 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]здесь[/url]. Для установки/получения цвета используй только Qt::BackgroundRole.


Название: Re: Color ComboBox
Отправлено: AlexMad от Январь 16, 2012, 11:45
а, так тебе надо было просто использовать UserRole вместо DecorationRole для получения цвета.

Вот!!! Именно то, что искал. Спасибо!!!


Название: Re: Color ComboBox
Отправлено: popper от Январь 16, 2012, 14:24
AlexMad, в библиотеке QSint есть еще интересные виджеты для выбора цвета.