7

为用户提供颜色选择反馈的最佳方式是什么?
我有一个带有“选择颜色”按钮的对话框,它会弹出一个QColorDialog. 做出选择后,我想向用户显示选择的颜色。
通常我会使用 aQLabel并在调色板中更改它的背景颜色。这种方法很麻烦,我认为不是很便携。

有这样做的标准方法吗?

4

6 回答 6

9

我这样做的方式如下:

我实际上改变了按钮的颜色,以反映用户的选择。为此,我使用了 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);
}
于 2008-11-12T07:43:01.130 回答
4
QColor chosenColor = QColorDialog::getColor(); //return the color chosen by user
setColorButton->setBackgroundColor(chosenColor);
setColorButton->setAutoFillBackground(true);
setColorButton->setFlat(true);

how about this?

于 2012-03-19T13:06:11.443 回答
2

您可以通过从 QPushButton 子类化并覆盖其paintEvent. 这应该为您提供一个漂亮的、具有原生外观的颜色按钮。我会尝试以下类似的方法。

颜色按钮.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

颜色按钮.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);
}

请注意,其中大部分是现场制作的,尚未完全微调。

于 2013-06-10T22:08:55.767 回答
2

我认为在这个用例中更改样式表和调色板是不合适的。我更喜欢生成一个 QPixmap 并在 QLabel 中显示它:

QPixmap pixmap(16, 16);
pixmap.fill(color);
label->setPixmap(pixmap);
于 2013-06-11T08:37:38.133 回答
0

您使用的方法很麻烦,但是是什么让您认为它不便携?它应该可以在 Qt 的任何地方工作。

除此之外,我会尝试以某种方式制作一个充满颜色的按钮,类似于 Jérôme 的回答,只是我可能会制作一个专用按钮来做到这一点,并以某种方式弄乱调色板。

于 2008-11-12T19:22:32.260 回答
0

Shihe Zhang 为我工作,除了在我的实现 QPushButton 没有 backgroundColor 属性。要设置按钮的颜色:

QPalette p;
p.setColor(QPalette::Button, color);
gColorButton->setPalette(p);
于 2012-10-30T21:38:20.723 回答