Показать результат выбора цвета в Qt? - PullRequest
5 голосов
/ 12 ноября 2008

Каков наилучший способ дать пользователю обратную связь для выбора цвета?
У меня есть диалоговое окно с кнопкой «Выбрать цвет», которая появляется QColorDialog. После того, как выбор сделан, я хочу показать пользователю выбранный цвет.
Обычно я делаю это, используя QLabel и меняя цвет фона в палитре. Этот метод громоздок, и я думаю, что не очень портативный.

Есть ли стандартный способ сделать это?

Ответы [ 6 ]

9 голосов
/ 12 ноября 2008

Я делаю это следующим образом:

Я на самом деле меняю цвет кнопки, чтобы отразить выбор пользователя. Для этого я использую таблицу стилей Qt, которая обеспечивает его переносимость:

const QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }");

QColor ChosenColor; // Color chosen by the user with QColorDialog
QColor IdealTextColor = getIdealTextColor(ChosenColor);
btnChooseColor->setStyleSheet(COLOR_STYLE.arg(ChosenColor.name()).arg(IdealTextColor.name()));

Чтобы убедиться, что метка кнопки всегда читаема, я вызываю метод getIdealTextColor (), который я нашел в статье codeproject:

//==============================================================================
//  Nom : getIdealTextColor
//! @return an ideal label color, based on the given background color.
//! Based on http://www.codeproject.com/cs/media/IdealTextColor.asp
//==============================================================================
QColor JSPreferencesDlg::getIdealTextColor(const QColor& rBackgroundColor) const
{
    const int THRESHOLD = 105;
    int BackgroundDelta = (rBackgroundColor.red() * 0.299) + (rBackgroundColor.green() * 0.587) + (rBackgroundColor.blue() * 0.114);
    return QColor((255- BackgroundDelta < THRESHOLD) ? Qt::black : Qt::white);
}
4 голосов
/ 19 марта 2012
QColor chosenColor = QColorDialog::getColor(); //return the color chosen by user
setColorButton->setBackgroundColor(chosenColor);
setColorButton->setAutoFillBackground(true);
setColorButton->setFlat(true);

как насчет этого?

2 голосов
/ 11 июня 2013

Я думаю, что изменение таблиц стилей и палитры не подходит в этом случае. Я предпочитаю генерировать QPixmap и показывать его в QLabel:

QPixmap pixmap(16, 16);
pixmap.fill(color);
label->setPixmap(pixmap);
2 голосов
/ 11 июня 2013

Вы можете легко сделать свою собственную кнопку выбора цвета, подклассифицировав QPushButton и переопределив ее paintEvent. Это должно дать вам красивую кнопку цвета. Я бы попробовал что-то вроде следующего.

colorbutton.h:

#ifndef COLORBUTTON_H
#define COLORBUTTON_H

#include <QtGui>

class ColorButton : public QPushButton
{
    Q_OBJECT
public:
    explicit ColorButton(const QColor & color = Qt::black, QWidget *parent = 0);
    QColor getColor();

signals:
    void colorChanged(QColor);

public slots:
    void changeColor(const QColor &);
    void chooseColor();
    void paintEvent(QPaintEvent *event);

private:
    QColor currentColor;
};

#endif // COLORBUTTON_H

colorbutton.cpp:

#include "colorbutton.h"

ColorButton::ColorButton(const QColor & color, QWidget *parent) :
    QPushButton(parent)
{
    this->setMinimumWidth(50);
    currentColor = color;
    connect(this, SIGNAL(clicked()), this, SLOT(chooseColor()));
}

QColor ColorButton::getColor()
{
    return currentColor;
}

void ColorButton::changeColor(const QColor & color)
{
    currentColor = color;
    colorChanged(currentColor);
}

void ColorButton::chooseColor()
{
    QColor color = QColorDialog::getColor(currentColor, this);
    if (color.isValid())
        changeColor(color);
}

void ColorButton::paintEvent(QPaintEvent *event)
{
    QPushButton::paintEvent(event);

    int colorPadding = 5;

    QRect rect = event->rect();
    QPainter painter( this );
    painter.setBrush( QBrush( currentColor ) );
    painter.setPen("#CECECE");
    rect.adjust(colorPadding, colorPadding, -1-colorPadding, -1-colorPadding);
    painter.drawRect(rect);
}

Обратите внимание, что большая часть этого была сделана на месте и еще не была полностью настроена.

0 голосов
/ 31 октября 2012

Шихе Чжан работает для меня, за исключением моей реализации, у QPushButton нет свойства backgroundColor. Чтобы установить цвет кнопки:

QPalette p;
p.setColor(QPalette::Button, color);
gColorButton->setPalette(p);
0 голосов
/ 12 ноября 2008

Метод, который вы используете, громоздок, но с чего вы взяли, что он не переносимый? Он должен работать везде, где работает Qt.

Кроме того, я бы попытался сделать цветную кнопку, похожую на ответ Жерома, только я, вероятно, сделал бы специальную кнопку, чтобы сделать это, и как-то связался с палитрой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...