一、前言
顏色按鈕面板主要用在提供一個顏色按鈕面板,用戶單擊某個按鈕,然后拿到對應的顏色值,用戶可以預先設定常用的顏色集合,傳入到控件中,自動生成面板顏色集合按鈕,每當滑過按鈕的時候,按鈕邊緣高亮提示當前所在顏色的按鈕,當選中某個按鈕時,右側顏色條顯示當前選中的顏色,此控件功能極其簡單,直接采用動態生成按鈕的方式,設置按鈕的樣式表來設置對應的顏色和高亮邊框等,單擊按鈕發出顏色改變信號即可,對外提供該信號就行,非常適合初學者學習。
二、實現的功能
- 1:可設置顏色集合
- 2:可設置按鈕圓角角度
- 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
五、核心代碼
#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();
}
}
六、控件介紹
- 超過149個精美控件,涵蓋了各種儀表盤、進度條、進度球、指南針、曲線圖、標尺、溫度計、導航條、導航欄,flatui、高亮按鈕、滑動選擇器、農歷等。遠超qwt集成的控件數量。
- 每個類都可以獨立成一個單獨的控件,零耦合,每個控件一個頭文件和一個實現文件,不依賴其他文件,方便單個控件以源碼形式集成到項目中,較少代碼量。qwt的控件類環環相扣,高度耦合,想要使用其中一個控件,必須包含所有的代碼。
- 全部純Qt編寫,QWidget+QPainter繪制,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等編譯器,支持任意操作系統比如windows+linux+mac+嵌入式linux等,不亂碼,可直接集成到Qt Creator中,和自帶的控件一樣使用,大部分效果只要設置幾個屬性即可,極為方便。
- 每個控件都有一個對應的單獨的包含該控件源碼的DEMO,方便參考使用。同時還提供一個所有控件使用的集成的DEMO。
- 每個控件的源代碼都有詳細中文注釋,都按照統一設計規范編寫,方便學習自定義控件的編寫。
- 每個控件默認配色和demo對應的配色都非常精美。
- 超過130個可見控件,6個不可見控件。
- 部分控件提供多種樣式風格選擇,多種指示器樣式選擇。
- 所有控件自適應窗體拉伸變化。
- 集成自定義控件屬性設計器,支持拖曳設計,所見即所得,支持導入導出xml格式。
- 自帶activex控件demo,所有控件可以直接運行在ie瀏覽器中。
- 集成fontawesome圖形字體+阿里巴巴iconfont收藏的幾百個圖形字體,享受圖形字體帶來的樂趣。
- 所有控件最后生成一個dll動態庫文件,可以直接集成到qtcreator中拖曳設計使用。
- 目前已經有qml版本,后期會考慮出pyqt版本,如果用戶需求量很大的話。
七、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、學習方法、寫作技巧、熱門技術、職場發展等內容,干貨多多,福利多多!