为用户提供颜色选择反馈的最佳方法是什么?
我有一个带有“选择颜色”按钮的对话框,弹出QColorDialog
。选择完成后,我想向用户显示所选的颜色
通常我使用QLabel
并在调色板中更改它的背景颜色来执行此操作。这种方法很麻烦,我认为不太便携。
有没有标准的方法呢?
答案 0 :(得分: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);
}
答案 1 :(得分:4)
QColor chosenColor = QColorDialog::getColor(); //return the color chosen by user
setColorButton->setBackgroundColor(chosenColor);
setColorButton->setAutoFillBackground(true);
setColorButton->setFlat(true);
怎么样?
答案 2 :(得分:2)
您可以通过从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);
}
请注意,大部分内容都是现场制作的,尚未经过完全调整。
答案 3 :(得分:2)
我认为在这个用例中改变样式表和调色板是不合适的。我更喜欢生成QPixmap并在QLabel中显示它:
QPixmap pixmap(16, 16);
pixmap.fill(color);
label->setPixmap(pixmap);
答案 4 :(得分:0)
您使用的方法很麻烦,但是什么让您觉得它不便携?它应该在Qt的任何地方工作。
除此之外,我会尝试以某种方式制作一个颜色填充的按钮,类似于Jérôme的答案,只有我可能会制作一个专门的按钮来完成它,并以某种方式弄乱调色板。
答案 5 :(得分:0)
Shihe Zhang的作品对我来说除了我的实现QPushButton没有backgroundColor属性。要设置按钮的颜色:
QPalette p;
p.setColor(QPalette::Button, color);
gColorButton->setPalette(p);