Qt动态桌面背景

简介: 笔记

一.简介


通过实现一个动态的桌面背景小程序,来加强对Qt的paintEvent的理解与使用,以及一些小知识。


二.实现过程


1. 初始化,并保存每段圆弧的起始度数和扫过的弧度,便于绘制圆弧。
 //记录二十一个圆的圆弧信息
 for(int i=0;i<21;i++) 
    {
        vector<double>  td;    //存放一个圆里面圆弧的起始度数
        vector<double>  pd;     //存放一个圆里面圆弧扫过的度数
        int st = rand()%10;
        int sweep = rand()%15;
        td.push_back(st);
        pd.push_back(sweep);
        while(st < 360)    //当起始度数超个360度时,意味着已经覆盖
       {                   //一整个圆
            st += sweep + rand()%20;
            sweep = rand()%35;
            td.push_back(st);
            pd.push_back(sweep);
        }
        St.push_back(td);   
        Sp.push_back(pd);
    }

2. 绘制圆弧,通过随机分配给每段圆弧不同的颜色,来达到很炫的效果

//用于将圆弧绘制在程序的中心位置
int w = this->width()/2;    //程序宽度的一半
int h = this->height()/2;   //程序高度的一半
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
 for(int i=0;i<Sp.size();i++)
 {
     vector<double>  td = St.at(i);
     vector<double>  pd = Sp.at(i);
     for(int j=0;j<td.size();j++)
     {
          //每次随机选择一种颜色
         pen.setColor(QColor(qrand()%255,qrand()%255,qrand()%255));
         painter.setPen(pen);
           //20为圆弧的半径增值,
           //w,h为程序的中心坐标,每次减去i*20,也就是圆的半径每次增加20
           //最后面的两个参数就是起始度数和扫过的度数
         painter.drawArc(w-i*20,h-i*20,i*20*2,i*20*2,td.at(j)*16,pd.at(j)*16);
     }
 }
 //绘制完成后,更新起始弧度,以达到动态的效果
 for(int i=0;i<Sp.size();i++)
 {
     vector<double>  td = St.at(i);
     vector<double>  pd = Sp.at(i);
     for(int j=0;j<td.size();j++)
     {
         St.at(i).at(j) += 1;
     }
 }


3. 绘制多彩球,以达到更好看的效果

//这个类是一个渐变色的类,可以添加多种不同的颜色
  // 以达到绘制出的图形的颜色的渐变的
   QRadialGradient radial(QPointF(85,85),35);//默认参数设置渐变的中心原点和半径
   for(double l = 0;l<1;l+=0.01)
   {
       radial.setColorAt(l,QColor(l*255,(1-l)*155,abs(0.5-l)*255,100));//设置渐变的颜色
   }
   //在渐变区域外重复渐变
   radial.setSpread(QGradient::ReflectSpread );
   painter.setBrush(radial);
   painter.drawEllipse(cx,cy,70,70);
  // 当达到程序的边界后,实现反弹,速度和反弹的方向是随机的
  //只要x,y方向的变化量不一样,就可以达到反弹方向随机
 if(cx+73 >= width() || cx <= 3)   //达到左右边界
 {    if(cx+73 >= width())
          dx = -(qrand()%10+2);
      else
          dx = qrand()%10+2;
 }
 if(cy+73 >= height() || cy  <= 3)  //达到上下边界
 {    if(cy+73 >= height())
          dy = -(qrand()%10+2);
      else
          dy = qrand()%10+2;
 }
//球心的坐标
 cx += dx;  
 cy += dy;


4. 实现效果

10.png

5. 如果运行时,不想在任务栏下出现,可以在main里面添加如下代码
using namespace std;
#include <Windows.h>
static BOOL enumUserWindowsCB(HWND hwnd, LPARAM lParam)
{
    long wflags = GetWindowLong(hwnd, GWL_STYLE);
    if (!(wflags & WS_VISIBLE)) return TRUE;
    HWND sndWnd;
    if (!(sndWnd = FindWindowEx(hwnd, NULL, L"SHELLDLL_DefView", NULL)))
        return TRUE;
    HWND targetWnd;
    if (!(targetWnd = FindWindowEx(sndWnd, NULL, L"SysListView32", L"FolderView")))
        return TRUE;
    HWND* resultHwnd = (HWND*)lParam;
    *resultHwnd = targetWnd;
    //*resultHwnd = hwnd;//set to workerW
    return FALSE;
}
HWND findDesktopIconWnd()
{
    HWND resultHwnd = NULL;
    EnumWindows((WNDENUMPROC)enumUserWindowsCB, (LPARAM)&resultHwnd);
    return resultHwnd;
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    HWND hdesktop = findDesktopIconWnd();
    WId wid = w.winId();
    SetParent((HWND)wid, hdesktop);
    w.show();
    return a.exec();
}

公众号:FPGA之旅

目录
相关文章
|
2月前
|
计算机视觉 C++
基于Qt的简易图片浏览器设计与实现
基于Qt的简易图片浏览器设计与实现
29 1
|
18天前
|
Unix Linux 程序员
QT背景介绍
QT背景介绍
|
24天前
|
Linux iOS开发 开发者
【Qt 学习笔记】Qt 背景介绍
【Qt 学习笔记】Qt 背景介绍
27 0
|
24天前
【Qt 学习笔记】Qt的坐标体系
【Qt 学习笔记】Qt的坐标体系
21 0
|
2月前
|
前端开发 数据可视化 JavaScript
【五一创作】QML、Qt Quick /Qt中绘制圆形
【五一创作】QML、Qt Quick /Qt中绘制圆形
45 0
|
6月前
|
计算机视觉 Python
openCV背景减除
openCV背景减除
30 0
|
8月前
|
Python
『PyQt5-Qt Designer篇』| 06 Qt Designer中水平布局和垂直布局的使用
『PyQt5-Qt Designer篇』| 06 Qt Designer中水平布局和垂直布局的使用
61 0
|
C++
Qt功能优化:Qt 3D画廊
Qt功能优化:Qt 3D画廊
216 1
Qt功能优化:Qt 3D画廊
|
前端开发 C++
qt 如何设计好布局和漂亮的界面。
qt 如何设计好布局和漂亮的界面。
qt 如何设计好布局和漂亮的界面。