Qt實用技巧:會呼吸的痛(呼吸點/呼吸燈)
Qt實用技巧:會呼吸的痛(呼吸點/呼吸燈)
感謝
Demo效果
入坑
主視窗為QWidget的子類時,不論設定QPallet和setStyleSheets設定背景圖片是無法生效的,但設定顏色卻可以生效。
Demo目錄結構
關鍵程式碼
已經在主視窗上添加了一個QWidget
主視窗關鍵程式碼,設定佈局,生成6個呼吸點
frmLightPoint::frmLightPoint(QWidget *parent) : QWidget(parent), ui(new Ui::frmLightPoint) { ui->setupUi(this); // 設定背景圖片 ui->widget->setStyleSheet("QWidget#widget {background: url(:/image/bg1.jpg); }"); // 使用Grid佈局 QGridLayout * pLayout = new QGridLayout(); // 生成 2行 3列 共 6 個控制元件 LightPoint *pLightPoint; for(int index = 0; index < 6; index++) { pLightPoint = new LightPoint(this); pLayout->addWidget(pLightPoint, index/3, index%3, 1, 1); // 控制元件指標加入列表,以便設定顏色,等同於 widgets.push_back(pLightPoint); widgets << pLightPoint; } // 設定佈局到主視窗上的QWidget ui->widget->setLayout(pLayout); // 顏色列表 QList<QColor> colors; colors << "#47A4E9" << "#00B17D" << "#D64D54" << "#DEAF39" << "#A279C5" << "#009679"; // 迴圈設定顏色 for (int index = 0; index < widgets.count(); index++) { widgets.at(index)->setBgColor(colors.at(index)); } }
呼吸點控制元件標頭檔案 lightpoint.h
#ifndef LIGHTPOINT_H #define LIGHTPOINT_H #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 *) override; 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
呼吸點控制元件原始碼 lightpoint.cpp
#include "lightpoint.h" #include "qpainter.h" #include "qevent.h" #include "qtimer.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 *) { QPainter painter(this); // 繪製準備工作 啟用反鋸齒 painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); // 平移座標軸中心, painter.translate(rect().width() / 2, rect().height() / 2); //繪製背景 drawBg(&painter); } void LightPoint::drawBg(QPainter *painter) { // 半徑為當前 寬 或者 高 的一半 int radius = qMin(rect().width(), rect().height())/2; // 儲存當前painter painter->save(); // 以點為中心的漸變色 QRadialGradient g(QPoint(0, 0), radius); // 迴圈加減 (offset < 100 && add) ? (offset += step) : (add = false); (offset > 0 && !add) ? (offset -= step) : (add = true); // 按照 點範圍[0.0,1.0] 對於 每點的顏色 bgColor.setAlpha( 200+offset > 255 ? 255 : 200+offset ); g.setColorAt(0.0, bgColor); bgColor.setAlpha( 140+offset); g.setColorAt(0.2, bgColor); bgColor.setAlpha( 80+offset); g.setColorAt(0.4, bgColor); bgColor.setAlpha( 20+offset >= 0 ? 20+offset : 0 ); g.setColorAt(0.6, bgColor); bgColor.setAlpha( -60+offset >= 0 ? -50+offset : 0 ); g.setColorAt(0.8, 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(); } }
原博主部落格地址:http://blog.csdn.net/qq21497936
本文章部落格地址:http://blog.csdn.net/qq21497936/article/details/78747244
相關推薦
Qt實用技巧:會呼吸的痛(呼吸點/呼吸燈)
Qt實用技巧:會呼吸的痛(呼吸點/呼吸燈) 感謝 Demo效果 入坑 主視窗為QWidget的子類時,不論設定QPallet和setStyleSheets設定背景圖片是無法生效的,但設定顏色卻可以生效。 Demo目錄結構
Qt實用技巧:使用QMediaPlayer播放mp4檔案
需求 做軟體時,點選一個按鈕切入另一個介面,需要播放一段動畫 原理 使用QMediaplayer,QVideoWidget,QMediaPlaylist實現,注意安裝解碼器 lavfilter(本機可播放,但qt不能播放,可能是解碼器的原因)
Qt實用技巧:使用Qt給指定手機發送簡訊(點對點、群發等等)
需求 軟體控制簡訊提醒客戶驗證碼等等,如生日提醒、購買提醒、時間限制等等。Demo下載地址Demo效果截圖簡訊平臺介紹 軟體傳送簡訊需要第三方平臺支援,步驟如下: 1.註冊指定雲平臺賬戶,一般有免費簡訊條數,筆者使用“雲通知”;
Qt實用技巧:ubuntu釋出程式打包流程(解決外掛xcb載入失敗)
原博主部落格地址:https://blog.csdn.net/qq21497936 本文章部落格地址:https://blog.csdn.net/qq21497936/article/details/85396652
Qt實用技巧:使用Qt載入超大圖片的耗時測試
需求 某機器人專案中,需要載入構建的地圖,此處僅測試直接載入圖片的時間。 相關部落格 《QT三大繪圖類:QPixmap/QImage/QPicture》:https://blog.csdn.net/qq2149
Qt實用技巧:設計模式之單例模式,唯一例項類通用模板
需求 Qt常需要一個類,全域性呼叫,是設計模式中的單例模式。 單例模式 單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物
Qt實用技巧:Qt併發伺服器通訊,受同一時刻最大執行緒數限制(筆者本本同一時刻600多)
需求 預言專案需要寫個qt伺服器,終端與qt伺服器完成socket通訊,因存在多個裝置,單個傳輸檔案大小比較大,所以做多執行緒併發。實現原理 客戶端:固定client的執行緒數量,單個執行緒按照設定的間隔不斷髮送資料給伺服器,並接收伺服器的執行緒指
Qt實用技巧:使用QMediaPlayer和Windows自帶元件播放swf、rmvb、mpg、mp4等視訊檔案
需求 做軟體時,點選進入介面需要播放一段視訊,該視訊的格式可相容swf、rmvb、mpg、mp4等視訊檔案。 原理 使用QMediaPlayer播放rmvb、mpg、mp4格式 使用windows Media Player
Qt實用技巧:基於tcp的C/S構架多人聊天程式(線上、離線、離線資訊再次登入後傳送等)
需求 多人聊天室程式,基於TCP和C/S構架,需要離線後可對離線者傳送資訊,待離線者上線後可收到上次傳送的離線資訊 技術點 1.TCP連線伺服器 2.伺服器得儲存所有客戶端列表,包括線上的不線上的 3.伺服器得通知每個客戶端當前線上
Qt實用技巧:QPainterPath繪圖路徑(多次畫同樣的圖形集合)
需求 根據配置檔案,可不改變程式只調整配置檔案可調整主頁面上的字串。 原理 1.讀取檔案,固定格式(檔案在本文章中省略) 2.寫一串字元,使用QPainterPath 3.注意QPainter的時候,需
Qt開發技巧:編寫.pro檔案,在構建流程中加入命令列的方法
1、在專案構建前執行命令 在專案構建前執行命令cmd 存在問題 system(cmd) 存在執行多次的問題,可以參考message函式的QMake Manual說明
實用技巧:Spring Cloud中,如何優雅下線微服務?
原文:http://www.itmuch.com/spring-cloud-sum/how-to-unregister-service-in-eureka/ ,轉載請說明出處。 在生產環境中,服務的上下線是不可避免的,我們希望能夠優雅地下線微服務。本文基於Spring Boot 2.x + Spring
【本人禿頂程式設計師】實用技巧:Spring Cloud中,如何優雅下線微服務
←←←←←←←←←←←← 我都禿頂了,還不點關注! 在生產環境中,服務的上下線是不可避免的,我們希望能夠優雅地下線微服務。本文基於Spring Boot 2.x + Spring Cloud Finchley講解實際專案中優雅下線服務的四種方式,並探討各方式的優缺點。 注:S
實用技巧:教你如何在沒有網路的Linux機器上快速安裝軟體
相信很多人遇到過這樣的問題: 你需要在公司的一臺伺服器上安裝xxx軟體,例如vsftpd; 該伺服器無法連線公網; 這臺伺服器很可能是一個最簡安裝的Linux(意味著該機器可能有很多常見的軟體依賴缺失),你也搞不清楚究竟是不是最簡安裝的,只能用uname -a&
實用技巧:利用4G U盤安裝Fedora Linux
一、準備軟體 1、已經下載Fedora-9-i386-DVD.iso 2、下載grubinst-1.1-bin-w32-2007-12-29和grub4dos-0.4.3-2008-05-02.zip 3、下載WinImage 二、步驟 用grub
shell實用技巧:檔案統計資訊和銀行賬戶管理系統
需求 寫一個shell程式命名為wc.sh,統計檔案字元數、行數和單詞數。 寫一個shell程命名為bank.sh,完成以下功能:退出、存款、取款、新增賬戶、刪除賬戶、查詢賬戶、顯示所有賬戶,所有資訊儲存在account.dat檔案中,每次操作會實
c實用技巧:檔案統計資訊和銀行賬戶管理系統
需求 寫一個shell程式命名為wc,統計檔案字元數、行數和單詞數。 寫一個shell程命名為bank,完成以下功能:退出、存款、取款、新增賬戶、刪除賬戶、查詢賬戶、顯示所有賬戶,所有資訊儲存在account.dat檔案中,每次操作會實時更新acc
Qml實用技巧:在可視元素之前半透明覆蓋一個可視元素,阻止滑鼠透(介面)傳(防止點選到被遮擋的按鈕)
需求 需要一個半遮擋的介面,遮擋住原來的介面,因為把用來被遮擋的介面寫成了元件,所以將其設定為需要遮擋的介面的子物件 BUG 每次點選後面和前面的按鈕都可以觸發,如下: Item { Rectangle { wi
linux實用技巧:ubuntu16.04 64位系統安裝32位系統相容包並修改dash(預設)為bash
需求 ubuntu16.04 64位系統安裝32位系統相容包並修改dash(預設)為bash命令列操作 在linux系統安裝32位相容包: sudo apt-g
C#實用技巧:建立並操作access資料庫(可無密,也可加密)
需求 C#使用小型資料庫,access和sqlite是首選,推薦使用access,可操作,建表視覺化,最大的好處在於可以加密。 說明 access資料庫是office辦公套件裡的Access建立的,依據office版本不同建立