C14—使用QT制作玫瑰散落特效定制程序员的专属浪漫-2022-11-14

场景

代码是为了碎银几两,浪漫才是至死不渝。实现将屏幕透明,然后花朵在坠落,音乐配上,背景图片在切换,实现程序员的专属浪漫。效果如下。背景不是桌面,而是截了一张图片被Qpainter画出来了。如果把花朵换成透明的,把背景换成甜甜的合照,在配上美好的音乐,再加上甜蜜的告白,高级感就来了。

 

简要步骤

  1. 实现玫瑰花的坠落,主要是通过准备图片素材,设置五十个随机起始点,设置随机的下落速度,另外在下落完毕之后进行下一次下落的循环。使用定时器20ms通过update()刷新一次图片位置出发Qpainter重绘。
  2. 与1类似,定时器2s重绘,切换不同的图片当作背景,使用timeevent来区分两个不同的事件。
  3. 获取屏幕中心位置并在中心位置绘制文字。
  4. 添加背景音乐的无限循环播放。
  5. 添加托盘菜单设置程序关闭菜单。

技术要点

       1.随机数的生成 

    //生成随机数的两种方法,方法1如下:
    QTime randtime;
    randtime = QTime::currentTime();
    qsrand(randtime.msec()+randtime.second()*1000); //以当前时间ms为随机种子
    int n = qrand() % 100;    //产生100以内的随机整数
    //方法2如下:
    int t = QRandomGenerator::global()->generate()%10;//产生10以内的随机整数

      2. 获取屏幕大小

QDesktopWidget* mydesktopWidget = QApplication::desktop();//获取屏幕属性
qDebug()<<"屏幕宽高分别为: "<width()<height();

        3.设置窗口属性

    this->setWindowFlags(Qt::FramelessWindowHint);//设置无窗口框架边界
    this->setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
    this->setFixedSize(1920,1080);//设置窗口大小

       4.定时器的另外一种方式


    //.h文件中声明
     void timerEvent(QTimerEvent *);
    //.app中实现
    void Widget::timerEvent(QTimerEvent *eve)
{
    if(eve->timerId()==id1){//第一个定时事件
        qDebug()<<"事件1"<timerId();
    }
    if(eve->timerId()==id2){//第二个定时事件
        qDebug()<<"事件2"<timerId();
    }
}
    //启用定时器
     int tim1 =startTimer(20);
     int tim2 = startTimer(2000);

       5.QMediaPlayer循环播放

此处应该注意,使用该模块需要在.pro中添加multimedia模块,添加QMediaPlayer和QMediaPlaylist头文件,具体操作如下。

 //添加播放音乐
    myPlayer=new QMediaPlayer(this);
    QString musName  = QDir::currentPath();
    myPlayer->setVolume(50);//设置音量:
    playList = new QMediaPlaylist(this); //创建 播放列别
    playList->addMedia(QUrl(musName+"/music/HappyBirthDay.mp3"));
    playList->setPlaybackMode(QMediaPlaylist::Loop);// 通过设置 播放列表循环 实现循环播放
    myPlayer->setPlaylist(playList);// 设置 播放列表到播放器
    myPlayer->play(); //开始播放

         6.Qpainter画图

        Day11QPainter

         7.关闭窗口

        

 //设置托盘菜单信息
     myIcon = new QSystemTrayIcon(QIcon(":/temp/close.png"));
     myIcon->setToolTip("close");//菜单提示
    //设置右键菜单
     QMenu * myMenu = new QMenu;
     QAction *subAct = new QAction("close");
//     subAct->setIcon(QIcon(":/temp/close.png"));
     myMenu->addAction(subAct);
     myIcon->setContextMenu(myMenu);
     myIcon->show();
     connect(subAct,&QAction::triggered,[=](){
         this->close();
     });

代码实现

main文件

#include "widget.h"
#include 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

.h文件

#ifndef WIDGET_H
#define WIDGET_H
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
#define PIC_NUM 8
#define ALL_NUM 50
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    void paintEvent(QPaintEvent *);
    void timerEvent(QTimerEvent *);
private:
    Ui::Widget *ui;
    QPixmap my_pic[PIC_NUM];
    QPixmap all_pic[ALL_NUM];
    QPoint point[ALL_NUM];
    int y_speed[ALL_NUM];
    QPixmap mLove[6];
    QTime randtime;
//    QTimer *timer;
    QSystemTrayIcon *myIcon;
    QMediaPlayer *myPlayer;//播放器指针
    QMediaPlaylist *playList;
    int cnt;
    int id1;
    int id2;

};
#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    cnt = 0;
    id1 = 0;
    id2 = 0;
    this->setWindowTitle("Happy Birthday!");
    this->setWindowFlags(Qt::FramelessWindowHint);//设置无窗口框架边界
    this->setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
    QDesktopWidget* desktopWidget = QApplication::desktop();//获取屏幕属性
    this->setFixedSize(desktopWidget->width(),desktopWidget->height());//适应屏幕大小
    //加载初始8张下落图片
    for(int i = 0;igenerate()%PIC_NUM;
        all_pic[j] = my_pic[n];
        int w = QRandomGenerator::global()->generate()%this->width();
        point[j].rx()= w;
        int h = QRandomGenerator::global()->generate()%this->height();
        point[j].ry()= -h;
        int y = QRandomGenerator::global()->generate()%10+5;
        y_speed[j] = y;
    }
     id1 =startTimer(20);
     id2 = startTimer(2000);
    //设置托盘菜单信息
     myIcon = new QSystemTrayIcon(QIcon(":/temp/close.png"));
     myIcon->setToolTip("close");//菜单提示
    //设置右键菜单
     QMenu * myMenu = new QMenu;
     QAction *subAct = new QAction("close");
//     subAct->setIcon(QIcon(":/temp/close.png"));
     myMenu->addAction(subAct);
     myIcon->setContextMenu(myMenu);
     myIcon->show();
     connect(subAct,&QAction::triggered,[=](){
         this->close();
     });
     //add love
    for(int k = 0;k<6;k++){
        QString filename = QString(":/temp/mlove%1.jpg").arg(k);
        mLove[k] = QPixmap(filename);
    }
//    mLove = mLove.scaled(desktopWidget->width(),desktopWidget->height()-20);
    //添加播放音乐
    myPlayer=new QMediaPlayer(this);
    QString musName  = QDir::currentPath();
    myPlayer->setVolume(50);//设置音量:
    playList = new QMediaPlaylist(this); //创建 播放列别
    playList->addMedia(QUrl(musName+"/music/HappyBirthDay.mp3"));
    playList->setPlaybackMode(QMediaPlaylist::Loop);// 通过设置 播放列表循环 实现循环播放
    myPlayer->setPlaylist(playList);// 设置 播放列表到播放器
    myPlayer->play(); //开始播放
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *Eve)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,mLove[cnt]);//画一张图
    //设置字体
    QFont font = painter.font();
    font.setPixelSize(100);
    painter.setFont(font);
    QPen pen = painter.pen();
    pen.setColor(Qt::red);
    painter.setPen(pen);
    QDesktopWidget* desktopWidget = QApplication::desktop();//获取屏幕属性
    const QRect rectangle = QRect(desktopWidget->width()/2-100, desktopWidget->height()/2, 1000, 100);
    painter.drawText(rectangle, 0, tr("杰敏,生日快乐!"));
    for(int i=0;itimerId()==id1){//第一个定时事件 切照片
        for(int j = 0;jthis->height()){
                point[j].ry() = 0;
            }
        }
        update();
    }
    if(eve->timerId()==id2){//第二个定时事件 坠花朵
        cnt++;
        if(cnt==6){
            cnt=0;
        }
    }
}

你可能感兴趣的:(Qt积累——小项目,qt5,qt,c++)