天天看點

qml 發光_Qt編寫自定義控件37-發光按鈕(會呼吸的痛) 一、前言二、實作的功能三、效果圖四、核心代碼六、控件介紹

一、前言

這個控件是好早以前寫的,已經授權過好幾個人開源過此控件代碼,比如紅磨坊小胖,此控件并不是來源于真實需求,而僅僅是突發奇想,類似于星星的閃爍,越到邊緣越來越淡,定時器動态改變邊緣發光的亮度,産生呼吸的效果,别名叫會呼吸的痛,看到這個歌名,又讓我想起了前女友,哎!久久不能忘懷!

大緻的原理就是使用了錐形漸變QRadialGradient,然後定時器改變該漸變畫刷的顔色的透明度值,産生呼吸效果。Qt中提供了好多種漸變畫刷,非常有用,可以執行畫刷的區域,然後等比例插值,指定插值對應的顔色,這樣使用起來就非常的豐富了。

二、實作的功能

* 1:可設定呼吸間隔

* 2:可設定顔色透明漸變步長

* 3:可設定背景顔色

三、效果圖

qml 發光_Qt編寫自定義控件37-發光按鈕(會呼吸的痛) 一、前言二、實作的功能三、效果圖四、核心代碼六、控件介紹

四、核心代碼

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

六、控件介紹

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版本,如果使用者需求量很大的話。