Qt学习之自定义控件——颜色下拉框

一、效果展示

二、实现

      项目需要,实现类似于MFC中的颜色下拉框,参考了多篇文章,自己写了这么一个颜色下拉框,基于QToolButton实现的。

Colorcombox.h

#ifndef COLORCOMBOX_H
#define COLORCOMBOX_H

#include <QToolButton>
#include <QRgb>

class ColorCombox : public QToolButton
{
    Q_OBJECT

public:
    ColorCombox(QWidget *parent = 0);
    ~ColorCombox();

    void setButtonIcon(const QString &imageFile, QColor color);

private:
    QMenu* createColorMenu(const char *slot, const char *slotColorBoard);
    QIcon createColorToolButtonIcon(const QString &imageFile, QColor color);
    QIcon createColorIcon(QColor color);

public:
    void setColor(QRgb color);
    QRgb getColor();

signals:
    void sigColorChanged(QColor color);

private slots:
    void OnColorChanged();           // 文本颜色设置
    void OnShowColorBoard();         // 颜色板
    void changeColor(QColor color);

private:
    QColor m_color;
};

#endif

Colorcombox.cpp

#include "Colorcombox.h"


#include <QAction>
#include <QGridLayout>
#include <QMenu>
#include <QPainter>
#include <QColorDialog>


const QColor colors[6][8] =
{
    {QColor(0, 0, 0, 255), QColor(170, 0, 0, 255), QColor(0, 85, 0, 255), QColor(170, 85, 0, 255),
    QColor(0, 170, 0, 255), QColor(170, 170, 0, 255), QColor(0, 255, 0, 255), QColor(170, 250, 0, 255)},

    {QColor(0, 0, 127, 255), QColor(170, 0, 127, 255), QColor(0, 85, 127, 255), QColor(170, 85, 127, 255),
    QColor(0, 170, 127, 255), QColor(170, 170, 127, 255), QColor(0, 255, 127, 255), QColor(170, 255, 127, 255)},

    {QColor(0, 0, 255, 255), QColor(170, 0, 255, 255), QColor(0, 85, 255, 255), QColor(170, 85, 255, 255),
    QColor(0, 170, 255, 255), QColor(170, 170, 255, 255), QColor(0, 255, 255, 255), QColor(170, 255, 255, 255)},

    {QColor(85, 0, 0, 255), QColor(255, 0, 0, 255), QColor(85, 85, 0, 255), QColor(255, 85, 0, 255),
    QColor(85, 170, 0, 255), QColor(255, 170, 0, 255), QColor(85, 255, 0, 255), QColor(255, 255, 0, 255)},

    {QColor(85, 0, 127, 255), QColor(255, 0, 127, 255), QColor(85, 85, 127, 255), QColor(255, 85, 127, 255),
    QColor(85, 170, 127, 255), QColor(255, 170, 127, 255), QColor(85, 255, 127, 255), QColor(255, 255, 127, 255)},

    {QColor(85, 0, 255, 255), QColor(255, 0, 255, 255), QColor(85, 85, 255, 255), QColor(255, 85, 255, 255),
    QColor(85, 170, 255, 255), QColor(255, 170, 255, 255), QColor(85, 255, 255, 255), QColor(255, 255, 255, 255)}
};



ColorCombox::ColorCombox(QWidget *parent) :
    QToolButton(parent)
{
    setPopupMode(QToolButton::InstantPopup );
    setMenu(createColorMenu(SLOT(OnColorChanged()), SLOT(OnShowColorBoard())));
    this->menu()->setStyleSheet("background-color:whitesmoke");
    setAutoFillBackground(true);
    this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    connect(this,SIGNAL(sigColorChanged(QColor)),this,SLOT(changeColor(QColor)));
}


ColorCombox::~ColorCombox()
{

}

void ColorCombox::setButtonIcon(const QString &imageFile, QColor color)
{
    setIcon(createColorToolButtonIcon(imageFile, color));
}

QMenu *ColorCombox::createColorMenu(const char *slot, const char *slotColorBoard)
{
    // 选择其他颜色
    QToolButton *pBtnOtherColor = new QToolButton;
    pBtnOtherColor->setText(tr("其他颜色"));
    pBtnOtherColor->setFixedSize(QSize(142, 20));
    pBtnOtherColor->setAutoRaise(true);
    pBtnOtherColor->setToolTip(tr("其他颜色"));
    connect(pBtnOtherColor, SIGNAL(clicked()), this, slotColorBoard);

    // 基本色
    QGridLayout *pGridLayout = new QGridLayout;
    pGridLayout->setAlignment(Qt::AlignCenter);
    pGridLayout->setContentsMargins(0, 0, 0, 0);
    pGridLayout->setSpacing(2);

    for (int iRow = 0; iRow < 6; iRow++)
    {
        for (int iCol = 0; iCol < 8; iCol++)
        {
            QAction *action = new QAction(this);
            action->setData(colors[iRow][iCol]);
            action->setIcon(createColorIcon(colors[iRow][iCol]));
            connect(action, SIGNAL(triggered()), this, slot);

            QToolButton *pBtnColor = new QToolButton;
            pBtnColor->setFixedSize(QSize(16, 16));
            pBtnColor->setAutoRaise(true);
            pBtnColor->setDefaultAction(action);

            pGridLayout->addWidget(pBtnColor, iRow, iCol);
        }
    }

    QWidget *widget = new QWidget;
    widget->setLayout(pGridLayout);

    QVBoxLayout *pVLayout = new QVBoxLayout;
    pVLayout->addWidget(widget);
    pVLayout->addWidget(pBtnOtherColor);

    QMenu *colorMenu = new QMenu(this);
    colorMenu->setLayout(pVLayout);

    return colorMenu;
}

QIcon ColorCombox::createColorToolButtonIcon(const QString &imageFile, QColor color)
{
    QPixmap pixmap(16, 18);
    pixmap.fill(Qt::transparent);

    QPainter painter(&pixmap);
    QPixmap image(imageFile);

    QRect target(0, 0, 16, 16);
    QRect source(0, 0, 16, 16);
    painter.fillRect(QRect(0, 13, 16, 4), color);
    painter.drawPixmap(target, image, source);
    return QIcon(pixmap);

    //return QIcon("");
}

QIcon ColorCombox::createColorIcon(QColor color)
{
    QPixmap pixmap(16, 16);
    QPainter painter(&pixmap);
    painter.setPen(Qt::NoPen);
    painter.fillRect(QRect(0, 0, 16, 16), color);

    return QIcon(pixmap);
}

void ColorCombox::OnColorChanged()
{
    QAction *pFillColorAction = new QAction(this);
    pFillColorAction = qobject_cast<QAction *>(sender());
    QColor color = qvariant_cast<QColor>(pFillColorAction->data());

    this->menu()->close();
    m_color = color;
    emit sigColorChanged(m_color);
}

void ColorCombox::OnShowColorBoard()
{
    this->menu()->close();
    this->setStyleSheet("background-color:whitesmoke");
    QColorDialog colordlg(this);
    QColor color = colordlg.getColor(m_color, this, tr("颜色对话框"));
    if (!color.isValid())
    {
        emit sigColorChanged(m_color);
        return;
    }

    m_color = color;
    emit sigColorChanged(m_color);
}


void ColorCombox::changeColor(QColor color)
{
    QString strstyle = QString("background-color:rgb(%1,%2,%3);").arg(QString::number(color.red()), QString::number(color.green()), QString::number(color.blue()));
    this->setStyleSheet(strstyle);
}

void ColorCombox::setColor(QRgb color)
{
    this->m_color = (QColor)color;
    emit sigColorChanged(m_color);
}

QRgb ColorCombox::getColor()
{
    QRgb mRgb = qRgb(m_color.red(),m_color.green(),m_color.blue());
    return mRgb;
}

三、使用

    加载控件,在工程pro文件中包含控件的pri文件,例如:

然后就可以直接代码使用了,当然不要忘记包含头文件;要想像其他控件一样可以从工具箱里拖动到UI中,还需要先编译,将编译版本改为Release,然后右键项目,点击清除,执行qmake,重新构建,找到编译目录下生成的dll文件和lib文件,复制到Qt安装目录下的Tools/QtCreator/bin/plugins/designer路径下,重新打开Qt Creator,可以在工具箱里面找到自定义的控件。

   setcolor():设置颜色下拉框当前颜色;

    getcolor():获得颜色下拉框当前颜色;

    

PS:自定义控件步骤

1、点击【新建项目或文件】,选择模板【其他项目】--【Qt4 设计师自定义控件】,按步骤为自定义控件设置路径和名称、编译器(这里编译器的选择很重要,使用和Qt Creator版本相同的MSVC编译器)、类名、父类名等。

2、将编译版本改为Release,然后右键项目,点击清除,执行qmake,重新构建,找到编译目录下生成的dll文件和lib文件,复制到Qt安装目录下的Tools/QtCreator/bin/plugins/designer路径下,重新打开Qt Creator,可以在工具箱里面找到自定义的控件。

                                                                          

代码下载:https://download.csdn.net/download/qq_37240404/12846335

参考文章:qt实现颜色下拉框控件

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值