Qt編寫自定義控制元件37-發光按鈕(會呼吸的痛)
阿新 • • 發佈:2019-07-24
一、前言
這個控制元件是好早以前寫的,已經授權過好幾個人開源過此控制元件程式碼,比如紅磨坊小胖,此控制元件並不是來源於真實需求,而僅僅是突發奇想,類似於星星的閃爍,越到邊緣越來越淡,定時器動態改變邊緣發光的亮度,產生呼吸的效果,別名叫會呼吸的痛,看到這個歌名,又讓我想起了前女友,哎!久久不能忘懷! 大致的原理就是使用了錐形漸變QRadialGradient,然後定時器改變該漸變畫刷的顏色的透明度值,產生呼吸效果。Qt中提供了好多種漸變畫刷,非常有用,可以執行畫刷的區域,然後等比例插值,指定插值對應的顏色,這樣使用起來就非常的豐富了。
二、實現的功能
- 1:可設定呼吸間隔
- 2:可設定顏色透明漸變步長
- 3:可設定背景顏色
三、效果圖
四、標頭檔案程式碼
#ifndef LIGHTPOINT_H #define LIGHTPOINT_H /** * 呼吸點控制元件 作者:feiyangqingyun(QQ:517216493) 2017-11-27 * 1:可設定呼吸間隔 * 2:可設定顏色透明漸變步長 * 3:可設定背景顏色 */ #include <QWidget> #ifdef quc #if (QT_VERSION < QT_VERSION_CHECK(5,7,0)) #include <QtDesigner/QDesignerExportWidget> #else #include <QtUiPlugin/QDesignerExportWidget> #endif class QDESIGNER_WIDGET_EXPORT LightPoint : public QWidget #else class LightPoint : public QWidget #endif { Q_OBJECT Q_PROPERTY(int step READ getStep WRITE setStep) Q_PROPERTY(int interval READ getInterval WRITE setInterval) Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor) public: explicit LightPoint(QWidget *parent = 0); ~LightPoint(); protected: void paintEvent(QPaintEvent *); void drawBg(QPainter *painter); private: int step; //顏色透明漸變步長 int interval; //定時器間隔 QColor bgColor; //背景顏色 QTimer *timer; //繪製定時器 int offset; //偏移量 bool add; //是否增加 public: int getStep() const; int getInterval() const; QColor getBgColor() const; QSize sizeHint() const; QSize minimumSizeHint() const; public slots: //設定顏色透明漸變步長 void setStep(int step); //設定定時器間隔 void setInterval(int interval); //設定背景顏色 void setBgColor(const QColor &bgColor); }; #endif // LIGHTPOINT_H
五、核心程式碼
#pragma execution_character_set("utf-8") #include "lightpoint.h" #include "qpainter.h" #include "qevent.h" #include "qtimer.h" #include "qdebug.h" LightPoint::LightPoint(QWidget *parent) : QWidget(parent) { step = 10; interval = 100; bgColor = QColor(255, 0, 0); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(100); offset = 0; add = true; } LightPoint::~LightPoint() { if (timer->isActive()) { timer->stop(); } } void LightPoint::paintEvent(QPaintEvent *) { int width = this->width(); int height = this->height(); int side = qMin(width, height); //繪製準備工作,啟用反鋸齒,平移座標軸中心,等比例縮放 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); painter.translate(width / 2, height / 2); painter.scale(side / 200.0, side / 200.0); //繪製背景 drawBg(&painter); } void LightPoint::drawBg(QPainter *painter) { int radius = 99; painter->save(); QRadialGradient g(QPoint(0, 0), radius); (offset < 70 && add) ? (offset += step) : (add = false); (offset > 0 && !add) ? (offset -= step) : (add = true); bgColor.setAlpha(255); g.setColorAt(0.1, bgColor); bgColor.setAlpha(100 + offset); g.setColorAt(0.3, bgColor); bgColor.setAlpha(50 + offset); g.setColorAt(0.6, bgColor); bgColor.setAlpha(0); g.setColorAt(1.0, bgColor); painter->setPen(Qt::NoPen); painter->setBrush(g); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore(); } int LightPoint::getStep() const { return this->step; } int LightPoint::getInterval() const { return this->interval; } QColor LightPoint::getBgColor() const { return this->bgColor; } QSize LightPoint::sizeHint() const { return QSize(100, 100); } QSize LightPoint::minimumSizeHint() const { return QSize(5, 5); } void LightPoint::setStep(int step) { if (this->step != step) { this->step = step; update(); } } void LightPoint::setInterval(int interval) { if (this->interval != interval) { this->interval = interval; timer->setInterval(interval); update(); } } void LightPoint::setBgColor(const QColor &bgColor) { if (this->bgColor != bgColor) { this->bgColor = bgColor; update(); } }
六、控制元件介紹
- 超過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、學習方法、寫作技巧、熱門技術、職場發展等內容,乾貨多多,