Qt用qml实现简单的粒子效果

原创 2016年08月28日 23:25:39

最终运行效果:

涉及到的Qt知识点: 事件:鼠标事件,键盘事件,Paint事件,以及图片遮罩,定时器

新建一个空的qmake工程, loginDlg, 找一个带透明背景的png图片作为背景图

建一个重载于QWidget的类,然后在构造的时候将图形加载并处理好,实现paintEvent函数,进行图形的绘制

需要理解的是Mask。 Mask怎么讲呢?做了一张图片,简单直观地了解下Mask:


重载的类:

.h

#ifndef LOGINDLG_H

#define LOGINDLG_H

#include <QLabel>

#include <QWidget>

 

class loginDlg : public QWidget

{

    Q_OBJECT

public:

    explicit loginDlg(QWidget *parent = 0);

 

protected:

    // 重载函数 响应鼠标事件 用于界面拖动

    virtual void mousePressEvent(QMouseEvent *event);

    virtual void mouseMoveEvent(QMouseEvent *event);

 

    // 实现键盘事件

    virtual void keyPressEvent(QKeyEvent *event);

 

    // 重绘

    virtual void paintEvent(QPaintEvent *event);

 

private slots:

    void showtime();

 

private:

    QPoint m_ptDrag;

    QLabel *m_pLabel;

    QPixmap m_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);

    QPalette p=palette();

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

    setPalette(p);

 

    m_pLabel =new QLabel;

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

 

    QGridLayout *mainLayout=new QGridLayout(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=new QTimer;   // 定时器

 

    // 到指定时间间隔后 触发timeout信号 响应showtime槽函数

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

 

    timer->start(10);// 启动定时器,timeout=10 即10毫秒触发一次信号

}

 

// 重载父类的虚函数

void loginDlg::mousePressEvent(QMouseEvent *event)

{

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

    {

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

        event->accept();

    }

    else if(event->button()==Qt::RightButton)

    {

        close();    // 右键关闭软件

    }

}

 

 

void loginDlg::mouseMoveEvent(QMouseEvent *event)

{

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

    event->accept();

}

 

void loginDlg::paintEvent(QPaintEvent *event)

{

    QPainter painter(this);

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

}

 

 

void loginDlg::keyPressEvent(QKeyEvent *event)

{

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

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

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

    {

        close();

    }

    else if(Qt::Key_Q == event->key())

    {

        close();

    }

}

 

 

void loginDlg::showtime()

{

    QTime time=QTime::currentTime();

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

}



然后,我们在main函数中调用并显示它即可

#include <QApplication>

#include <QWidget>

#include <QVBoxLayout>

#include <QTextEdit>

 

#include "logindlg.h"

 

int main(int argc, char* argv[])

{

    QApplication app(argc, argv);

 

    loginDlg* pW = new loginDlg();

 

    pW->show();

 

    return app.exec();

}

 


若在Qt中,使用资源文件,比如图片等,若无法显示,首先考虑使用的图片路径是否正确。可先采用绝对路径作测试,若绝对路径可以正常显示,则再改为相对路径。

在工程文件中,添加一个Qt Resource的资源库,然后再在库中添加图片,复制此图片的路径,即为相对路径

比如:获取图片Image的路径三种方式:

(相对路径) qrc:/res/other/256-1.png

(网络路径) http://www.qzher.com/onlyfortest-not-exist.png
(绝对路径) file:///D:/qzher/abc.png

源码下载: http://download.csdn.net/detail/sinat_35523212/9603234


Linux下,基于Qt5.7, 若Windows下报错,可将中文注释删除即可。
此为QtCreate之Bug

版权声明:更多文件,请访问 qzher.com 致力于良心IT培训,深圳QQ群:326023167

相关文章推荐

QML类型说明-Emitter

Emitter ImportStatement:   import QtQuick.Particles 2.0 acceleration: StochasticDirection ...

Qt Quick里的粒子系统

一个使用 Qt Quick 粒子系统的简单示例……
  • foruok
  • foruok
  • 2015-01-04 07:26
  • 8905

QT程序员使用QML

使用QML并不需要Qt的知识,如果你已经熟悉Qt,那么很多知识都可以直接用于学习和使用QML.当然,使用QML定义UI的应用程序还是需要使用Qt实现非UI逻辑的. 熟悉的概念 QML直接支持如下Q...

Qt用qml实现简单的粒子效果

粒子系统,一直是各大游戏引擎标配的一个模块 粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的 game physics。 经常使用粒子系...

Qt移动应用开发(四):应用粒子特效

上一篇文章介绍了Qt Quick是怎样对帧动画进行支持的。帧动画的实现离不开状态机、而状态机、动画和状态切换(transitions)则是Qt框架的核心内容,也就是说它们可以建立在任何一个QObjec...

qml界面-最小化再重新获得焦点-的界面刷新(重绘)问题

问题描述: 问题起源于我的之前一篇blog里:QML中利用JavaScript显示当前时间信息 最后,我提到在qml中通过js不断的设置Text(或TextEdit)的文本(text)信息来显...

qml的绘图Canvas

import QtQuick 2.5 import QtQuick.Window 2.2 Window { visible: true width: 400 height: 4...

QT学习笔记

QT学习笔记(一) 作者:Kagula 最后更新日期:2015-01-07 目的: 了解QT基本开发流程。 正文: 准备: 环境: VS2010SP1、 VS2013Update3、 Wi...

用QML和Qt C++实现翻页效果的研究(1)

先占位,明天补上
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)