1. 程式人生 > >Qt用qml實現簡單的粒子效果

Qt用qml實現簡單的粒子效果

最終執行效果:

涉及到的Qt知識點: 事件:滑鼠事件,鍵盤事件,Paint事件,以及圖片遮罩,定時器

新建一個空的qmake工程, loginDlg, 找一個帶透明背景的png圖片作為背景圖

建一個重載於QWidget的類,然後在構造的時候將圖形載入並處理好,實現paintEvent函式,進行圖形的繪製

需要理解的是Mask。 Mask怎麼講呢?做了一張圖片,簡單直觀地瞭解下Mask:

過載的類:

.h

#ifndefLOGINDLG_H

#defineLOGINDLG_H

#include<QLabel>

#include<QWidget>

class

loginDlg:publicQWidget

{

Q_OBJECT

public:

explicitloginDlg(QWidget*parent=0);

protected:

// 過載函式 響應滑鼠事件 用於介面拖動

virtualvoidmousePressEvent(QMouseEvent*event);

virtualvoidmouseMoveEvent(QMouseEvent*event);

//實現鍵盤事件

virtualvoidkeyPressEvent(QKeyEvent*event);

//重繪

virtualvoidpaintEvent(QPaintEvent

*event);

privateslots:

voidshowtime();

private:

QPointm_ptDrag;

QLabel*m_pLabel;

QPixmapm_pixMap;

};

#endif//LOGINDLG_H

.cpp

#include"logindlg.h"

#include<QTime>

#include<QTimer>

#include<QEvent>

#include<QGridLayout>

#include<QBitmap>

#include<QMouseEvent>

#include<QPainter>

loginDlg::loginDlg(QWidget*parent):QWidget(parent)

{

setWindowFlags(Qt::FramelessWindowHint);

QPalettep=palette();

p.setColor(QPalette::WindowText,Qt::green);

setPalette(p);

m_pLabel=newQLabel;

m_pLabel->setStyleSheet("font-size:56px;color:blue");

QGridLayout*mainLayout=newQGridLayout(this);

mainLayout->addWidget(m_pLabel,0,0,Qt::AlignHCenter);

m_pixMap.load(":/Res/login.png",0,

Qt::AvoidDither|Qt::ThresholdDither|

Qt::ThresholdAlphaDither);

resize(m_pixMap.size());

// 以png圖片為遮罩,遮罩外面的圖就進行刪除

// 最終實現了不規則圖形

setMask(QBitmap(m_pixMap.mask()));

QTimer*timer=newQTimer;//定時器

// 到指定時間間隔後 觸發timeout訊號 響應showtime槽函式

connect(timer,SIGNAL(timeout()),this,SLOT(showtime()));

timer->start(10);// 啟動定時器,timeout=10 即10毫秒觸發一次訊號

}

// 過載父類的虛擬函式

voidloginDlg::mousePressEvent(QMouseEvent*event)

{

if(event->button()==Qt::LeftButton)

{

m_ptDrag=event->globalPos()-frameGeometry().topLeft();

event->accept();

}

elseif(event->button()==Qt::RightButton)

{

close();// 右鍵關閉軟體

}

}

voidloginDlg::mouseMoveEvent(QMouseEvent*event)

{

move(event->globalPos()-m_ptDrag);

event->accept();

}

voidloginDlg::paintEvent(QPaintEvent*event)

{

QPainterpainter(this);

painter.drawPixmap(0,0,QPixmap(":/Res/login.png"));

}

voidloginDlg::keyPressEvent(QKeyEvent*event)

{

if(event->key()==Qt::Key_Return&&

(event->modifiers()&Qt::ControlModifier)&&

(event->modifiers()&Qt::ShiftModifier))

{

close();

}

elseif(Qt::Key_Q==event->key())

{

close();

}

}

voidloginDlg::showtime()

{

QTimetime=QTime::currentTime();

m_pLabel->setText(time.toString("Ahh:mm:ss"));

}

然後,我們在main函式中呼叫並顯示它即可

#include<QApplication>

#include<QWidget>

#include<QVBoxLayout>

#include<QTextEdit>

#include"logindlg.h"

intmain(intargc,char*argv[])

{

QApplicationapp(argc,argv);

loginDlg*pW=newloginDlg();

pW->show();

returnapp.exec();

}

若在Qt中,使用資原始檔,比如圖片等,若無法顯示,首先考慮使用的圖片路徑是否正確。可先採用絕對路徑作測試,若絕對路徑可以正常顯示,則再改為相對路徑。

在工程檔案中,新增一個Qt Resource的資源庫,然後再在庫中新增圖片,複製此圖片的路徑,即為相對路徑

比如:獲取圖片Image的路徑三種方式:

(相對路徑) qrc:/res/other/256-1.png

Linux下,基於Qt5.7, 若Windows下報錯,可將中文註釋刪除即可。
此為QtCreate之Bug

相關推薦

Qtqml實現簡單粒子效果

最終執行效果: 涉及到的Qt知識點: 事件:滑鼠事件,鍵盤事件,Paint事件,以及圖片遮罩,定時器 新建一個空的qmake工程, loginDlg, 找一個帶透明背景的png圖片作為背景圖 建

QML實現簡單音視訊播放器的實踐

用QML的MediaPlayer控制元件配合VideoOutput對可以對音訊檔案和視訊檔案進行播放,程式碼如下: VideoOutput {     id: video_out     anchors.fill: parent     source: mediaPlaye

Android兩張圖片實現簡單動畫效果

直接在java程式碼裡寫圖片佈局,而不用XML檔案。 先宣告定義: ImageView imageviewsudubg; ImageView imageviewsudu; LinearLayout l

jQuery實現簡單的DOM操作

追加 匹配 簡單的 rep 兄弟節點 子元素 spa 添加元素 新建 通過jQuery創建元素節點:$oLi = $("<li></li>");這樣我們就創建了一個li標簽 如果想在元素節點中添加文本的話也挺簡單:$oLi = $("<li&g

jq實現簡單輪播

cti 標簽 function radi har mil ott ava 懸停 一個簡單的實例: css代碼: <style type="text/css">@charset "utf-8";*{ padding:0px; border:

【前端】jQuery實現瀑布流效果

scrollto title n) 個性 避免 ive gets type turn jQuery實現瀑布流效果 何為瀑布流:   瀑布流,又稱瀑布流式布局。是比較流行的一種網站頁面布局,視覺表現為參差不齊的多欄布局,隨著頁面滾動條向下滾動,這種布局還會不斷加載數據塊並附加

javascript實現簡單戶登錄驗證

-c turn get https 沒有 驗證 utf-8 .com head 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="

【SSH學習筆記】Struts2實現簡單戶登錄

utf-8 png rds href -a his ets 屬性 url 準備階段 在使用學習Struts2的時候首先要下載相應的架包 Struts2資源下載 這裏建議下載第一個,在struts-2.5.14.1-all.zip裏有很多實用的東西,不僅有架包還有官方為開發

神級程序員教你Python實現簡單的導彈自動追蹤!此乃裝逼神技!

大致 範圍 發現 完美 容易 game 分析 iss 兩個 由於待會要用pygame演示,他的坐標系是y軸向下,所以這裏我們也用y向下的坐標系。 計算sina和cosa,正弦對比斜,余弦鄰比斜,斜邊可以利用兩點距離公式計算出,即: 於是 AC的長度就是導彈的速度乘

基於select類型多路IO復實現簡單socket並發

清理 就是 ive class sockets true 簡單 Coding conn 還有很多缺限,如客戶斷開無限重復 以下轉至老師博客: server: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__

jq實現動態粒子效果

tex ret padding 粒子 proto scrip rip [] 3D 在線上看到別人做的動態粒子,哇,太炫了,我也來試一試。 <!DOCTYPE html><html> <head> <meta charset="UT

Python實現簡單的名片管理系統

rem 代碼 card 刪除 import val 字典 fin pytho 首先新建項目,包含主程序cards_main和工具庫cards_tools: 如下:main函數主主要使用while和if實現4功能切換,切換的具體操作由cards_tools中的函數執行。不說了

linux網絡編程之socket實現簡單客戶端和服務端的通信(基於UDP)

服務端 msg ets lin fgets err n) stderr tcp 單客戶端和服務端的通信(基於UDP) 代碼 服務端代碼socket3.c #include<sys/types.h> #include<sys/socket.h>

div css Firefox和IE瀏覽器相容問題 CSS實現cellSpacing屬性效果

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

使用angular路由複策略實現標籤欄效果

前段時間在後臺管理端要實現的一個需求是做個類似瀏覽器中的標籤欄。方便使用者在不同報表中檢視和比對。 查了一些方法,可以通過angular的動態元件方式實現和路由複用的方式實現。   動態元件大體上就是把每個開啟的頁放入到componentFactory中,然後判斷當前應該顯示哪個頁就好了。

JavaScript 實現簡單拼圖遊戲

本篇主要講解,如何利用原生的 JavaScript 來實現一個簡單的拼圖小遊戲。 線上體驗地址:拼圖 一、遊戲的基礎邏輯 想用一門語言來開發遊戲,必須先了解如何使用這門語言來實現一些基礎邏輯,比如影象的繪製、互動的處理、定時器等。 1、圖形繪製 圖形繪製是一切的基礎,這裡使用 Ja

SpringCloud(一) springboot實現簡單服務呼叫

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JavaScript實現簡單的驗證碼

                                用JavaScript實現簡單的驗證碼 先展示一下最終的效果圖

Javascript實現回到頂部效果

經常看到網頁中有回到頂部的效果,今天也研究一下回到頂部有哪些方法。眾所周知,用錨鏈接是實現回到最簡單的方法,但是從使用者體驗效果來說,並不是最好的。(錨鏈接回到頂部時太快了,而且使用者可能在看到某個感興趣的東西想停下來,卻停不下來),針對上面的缺點,我們試著用Javascript的方法來得到實現。思路是這個樣

C++實現簡單的檔案I/O操作

檔案 I/O 在C++中比烤蛋糕簡單多了。 在這篇文章裡,我會詳細解釋ASCII和二進位制檔案的輸入輸出的每個細節,值得注意的是,所有這些都是用C++完成的。 一、ASCII 輸出 為了使用下面的方法, 你必須包含標頭檔案<fstream.h>(譯者注:在標準C++中,已