【问题标题】:Show result of Color selection in Qt?在 Qt 中显示颜色选择的结果?
【发布时间】:2008-11-12 03:32:03
【问题描述】:

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

有这样做的标准方法吗?

【问题讨论】:

    标签: qt user-interface colors


    【解决方案1】:

    我的做法如下:

    我实际上改变了按钮的颜色,以反映用户的选择。为此,我使用了 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);
    }
    

    【讨论】:

      【解决方案2】:
      QColor chosenColor = QColorDialog::getColor(); //return the color chosen by user
      setColorButton->setBackgroundColor(chosenColor);
      setColorButton->setAutoFillBackground(true);
      setColorButton->setFlat(true);
      

      这个怎么样?

      【讨论】:

        【解决方案3】:

        您可以通过从 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
        

        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);
        }
        

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

        【讨论】:

          【解决方案4】:

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

          QPixmap pixmap(16, 16);
          pixmap.fill(color);
          label->setPixmap(pixmap);
          

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              【解决方案6】:

              Shihe Zhang 对我的作品除了在我的实现中 QPushButton 没有 backgroundColor 属性。设置按钮颜色:

              QPalette p;
              p.setColor(QPalette::Button, color);
              gColorButton->setPalette(p);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-12-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-06-28
                • 2013-04-11
                • 2010-12-30
                相关资源
                最近更新 更多