1. 程式人生 > >Qt實用技巧:會呼吸的痛(呼吸點/呼吸燈)

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版本不同建立