Qt編寫自定義控件27-顏色按鈕面板

1、前言

顏色按鈕面板主要用在提供一個顏色按鈕面板,用戶單擊某個按鈕,而後拿到對應的顏色值,用戶能夠預先設定經常使用的顏色集合,傳入到控件中,自動生成面板顏色集合按鈕,每當滑過按鈕的時候,按鈕邊緣高亮提示當前所在顏色的按鈕,當選中某個按鈕時,右側顏色條顯示當前選中的顏色,此控件功能極其簡單,直接採用動態生成按鈕的方式,設置按鈕的樣式表來設置對應的顏色和高亮邊框等,單擊按鈕發出顏色改變信號便可,對外提供該信號就行,很是適合初學者學習。linux

2、實現的功能

  • 1:可設置顏色集合
  • 2:可設置按鈕圓角角度
  • 3:可設置列數
  • 4:可設置按鈕邊框寬度和邊框顏色

3、效果圖

4、頭文件代碼

#ifndef COLORPANELBTN_H
#define COLORPANELBTN_H

/**
 * 顏色按鈕面板 做者:feiyangqingyun(QQ:517216493) 2017-11-17
 * 1:可設置顏色集合
 * 2:可設置按鈕圓角角度
 * 3:可設置列數
 * 4:可設置按鈕邊框寬度和邊框顏色
 */

#include <QWidget>

class QGridLayout;
class QPushButton;

#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif

class QDESIGNER_WIDGET_EXPORT ColorPanelBtn : public QWidget
#else
class ColorPanelBtn : public QWidget
#endif

{
    Q_OBJECT
    Q_PROPERTY(int space READ getSpace WRITE setSpace)
    Q_PROPERTY(int columnCount READ getColumnCount WRITE setColumnCount)
    Q_PROPERTY(int borderRadius READ getBorderRadius WRITE setBorderRadius)
    Q_PROPERTY(int borderWidth READ getBorderWidth WRITE setBorderWidth)
    Q_PROPERTY(QColor borderColor READ getBorderColor WRITE setBorderColor)

public:
    explicit ColorPanelBtn(QWidget *parent = 0);

private:
    QGridLayout *gridLayout;
    QList<QPushButton *> btns;
    QStringList colors;

    int space;                  //按鈕之間的間隔
    int columnCount;            //按鈕列數
    int borderRadius;           //邊框圓角
    int borderWidth;            //邊框寬度
    QColor borderColor;         //邊框顏色

private slots:
    void initStyle();
    void initBtn();
    void btnClicked();

public:
    QStringList getColors()     const;

    int getSpace()              const;
    int getColumnCount()        const;
    int getBorderRadius()       const;
    int getBorderWidth()        const;
    QColor getBorderColor()     const;

    QSize sizeHint()            const;
    QSize minimumSizeHint()     const;

public Q_SLOTS:
    //設置顏色集合
    void setColors(const QStringList &colors);

    //設置按鈕間隔
    void setSpace(int space);

    //設置列數
    void setColumnCount(int columnCount);

    //設置圓角角度
    void setBorderRadius(int borderRadius);

    //設置邊框寬度
    void setBorderWidth(int borderWidth);

    //設置邊框顏色
    void setBorderColor(const QColor &borderColor);

Q_SIGNALS:
    void colorChanged(const QColor &color);

};

#endif // COLORPANELBTN_H

5、核心代碼

#pragma execution_character_set("utf-8")

#include "colorpanelbtn.h"
#include "qlayout.h"
#include "qpushbutton.h"
#include "qdebug.h"

ColorPanelBtn::ColorPanelBtn(QWidget *parent) : QWidget(parent)
{
    colors << "#FEFEFE" << "#EEEEEF" << "#DCDDDD" << "#C9CACA" << "#B6B6B7" << "#A1A1A1" << "#8B8B8C" << "#757475" << "#5F5D5D" << "#474443" << "#303030";
    colors << "#00A2E9" << "#009B4C" << "#FFF000" << "#E62129" << "#E40082" << "#B04B87" << "#F08519" << "#F4B3B3" << "#897870" << "#D2CDE6" << "#A79CCB";
    colors << "#758FC8" << "#7C6FB0" << "#9288B1" << "#566892" << "#5E5872" << "#7789A4" << "#008FD7" << "#A0D9F6" << "#B8CEDA" << "#98AAB4" << "#75838A";
    colors << "#50585D" << "#5B7877" << "#4B8D7F" << "#769C9B" << "#5BA997" << "#5FA776" << "#62C3D0" << "#56AAB7" << "#B9CCBC" << "#D5EAD8" << "#A6D4AE";
    colors << "#99A99C" << "#9AA780" << "#BCC774" << "#BBC99A" << "#ACCE22" << "#D9E483" << "#5F5C50" << "#8B8979" << "#B6B49E" << "#B6B281" << "#DED572";
    colors << "#FFF582" << "#FFF9B1" << "#FFFCDB" << "#B39B77" << "#D59961" << "#DAB96B" << "#EF8641" << "#F6AE45" << "#F5B06E" << "#FDD100" << "#FBD7A3";
    colors << "#89765B" << "#AC6249" << "#D0753B" << "#EF8762" << "#F5B193" << "#FADAC9" << "#AF8283" << "#CF7771" << "#FF696B" << "#CF788A" << "#E61D4C";
    colors << "#EF8781" << "#E95A6F" << "#D49D9E" << "#876474" << "#AC6484" << "#F4B5D0" << "#D49EB6" << "#B39FA8" << "#D8C0CB" << "#B3719D" << "#CA5599";
    colors << "#CD81B3" << "#B593B3" << "#D0A9CD" << "#745E73" << "#977B95" << "#A878B1" << "#A72185" << "#934787" << "#804E9A" << "#7B5882" << "#714588";

    space = 2;
    columnCount = 11;
    borderRadius = 0;
    borderWidth = 2;
    borderColor = QColor("#C0392B");

    gridLayout = new QGridLayout;
    gridLayout->setSpacing(space);
    gridLayout->setMargin(0);
    this->setLayout(gridLayout);
    this->initStyle();
    this->initBtn();    
}

void ColorPanelBtn::initStyle()
{
    QString qss = QString("QPushButton{border:none;border-radius:%1px;}"
                          "QPushButton:hover{border:%2px solid %3;}")
                  .arg(borderRadius).arg(borderWidth).arg(borderColor.name());
    this->setStyleSheet(qss);
}

void ColorPanelBtn::initBtn()
{
    qDeleteAll(btns);
    btns.clear();

    int count = colors.count();
    int row = 0;
    int column = 0;
    int index = 0;
    for (int i = 0; i < count; i++) {
        QPushButton *btn = new QPushButton;
        connect(btn, SIGNAL(pressed()), this, SLOT(btnClicked()));
        btn->setObjectName("btn" + colors.at(i));
        btn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        btn->setStyleSheet(QString("QPushButton{background:%1;}").arg(colors.at(i)));

        gridLayout->addWidget(btn, row, column);
        column++;
        index++;

        if (index % columnCount == 0) {
            row++;
            column = 0;
        }

        btns.append(btn);
    }
}

void ColorPanelBtn::btnClicked()
{
    QPushButton *btn = (QPushButton *)sender();
    QString objName = btn->objectName();
    emit colorChanged(QColor(objName.right(7)));
}

QStringList ColorPanelBtn::getColors() const
{
    return this->colors;
}

int ColorPanelBtn::getSpace() const
{
    return this->space;
}

int ColorPanelBtn::getColumnCount() const
{
    return this->columnCount;
}

int ColorPanelBtn::getBorderRadius() const
{
    return this->borderRadius;
}

int ColorPanelBtn::getBorderWidth() const
{
    return this->borderWidth;
}

QColor ColorPanelBtn::getBorderColor() const
{
    return this->borderColor;
}

QSize ColorPanelBtn::sizeHint() const
{
    return QSize(400, 300);
}

QSize ColorPanelBtn::minimumSizeHint() const
{
    return QSize(40, 30);
}

void ColorPanelBtn::setColors(const QStringList &colors)
{
    if (this->colors != colors) {
        this->colors = colors;
        this->initBtn();
    }
}

void ColorPanelBtn::setSpace(int space)
{
    if (this->space != space) {
        this->space = space;
        this->gridLayout->setSpacing(space);
    }
}

void ColorPanelBtn::setColumnCount(int columnCount)
{
    if (this->columnCount != columnCount) {
        this->columnCount = columnCount;
        this->initBtn();
    }
}

void ColorPanelBtn::setBorderRadius(int borderRadius)
{
    if (this->borderRadius != borderRadius) {
        this->borderRadius = borderRadius;
        this->initStyle();
    }
}

void ColorPanelBtn::setBorderWidth(int borderWidth)
{
    if (this->borderWidth != borderWidth) {
        this->borderWidth = borderWidth;
        this->initStyle();
    }
}

void ColorPanelBtn::setBorderColor(const QColor &borderColor)
{
    if (this->borderColor != borderColor) {
        this->borderColor = borderColor;
        this->initStyle();
    }
}

6、控件介紹

  1. 超過149個精美控件,涵蓋了各類儀表盤、進度條、進度球、指南針、曲線圖、標尺、溫度計、導航條、導航欄,flatui、高亮按鈕、滑動選擇器、農曆等。遠超qwt集成的控件數量。
  2. 每一個類均可以獨立成一個單獨的控件,零耦合,每一個控件一個頭文件和一個實現文件,不依賴其餘文件,方便單個控件以源碼形式集成到項目中,較少代碼量。qwt的控件類環環相扣,高度耦合,想要使用其中一個控件,必須包含全部的代碼。
  3. 所有純Qt編寫,QWidget+QPainter繪製,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等編譯器,支持任意操做系統好比windows+linux+mac+嵌入式linux等,不亂碼,可直接集成到Qt Creator中,和自帶的控件同樣使用,大部分效果只要設置幾個屬性便可,極爲方便。
  4. 每一個控件都有一個對應的單獨的包含該控件源碼的DEMO,方便參考使用。同時還提供一個全部控件使用的集成的DEMO。
  5. 每一個控件的源代碼都有詳細中文註釋,都按照統一設計規範編寫,方便學習自定義控件的編寫。
  6. 每一個控件默認配色和demo對應的配色都很是精美。
  7. 超過130個可見控件,6個不可見控件。
  8. 部分控件提供多種樣式風格選擇,多種指示器樣式選擇。
  9. 全部控件自適應窗體拉伸變化。
  10. 集成自定義控件屬性設計器,支持拖曳設計,所見即所得,支持導入導出xml格式。
  11. 自帶activex控件demo,全部控件能夠直接運行在ie瀏覽器中。
  12. 集成fontawesome圖形字體+阿里巴巴iconfont收藏的幾百個圖形字體,享受圖形字體帶來的樂趣。
  13. 全部控件最後生成一個dll動態庫文件,能夠直接集成到qtcreator中拖曳設計使用。
  14. 目前已經有qml版本,後期會考慮出pyqt版本,若是用戶需求量很大的話。

7、SDK下載

  • SDK下載連接:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 提取碼:877p
  • 下載連接中包含了各個版本的動態庫文件,全部控件的頭文件,使用demo,自定義控件+屬性設計器。
  • 自定義控件插件開放動態庫dll使用(永久免費),無任何後門和限制,請放心使用。
  • 目前已提供26個版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
  • 不按期增長控件和完善控件,不按期更新SDK,歡迎各位提出建議,謝謝!
  • widget版本(QQ:517216493)qml版本(QQ:373955953)三峯駝(QQ:278969898)。
  • 濤哥的知乎專欄 Qt進階之路 https://zhuanlan.zhihu.com/TaoQt
  • 歡迎關注微信公衆號【高效程序員】,C++/Python、學習方法、寫做技巧、熱門技術、職場發展等內容,乾貨多多,福利多多!
相關文章
相關標籤/搜索