Qt动态桌面背景
2023-03-14 22:59:01 时间
一.简介
通过实现一个动态的桌面背景小程序,来加强对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. 实现效果
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之旅
相关文章
- Wasm 玩出花?在浏览器中运行虚拟机!
- 买云服务器用什么操作系统
- 云服务器选什么操作系统
- 云服务器要多少钱
- 域名转移需要多少个工作日
- 域名到期前多少天不能转移
- 域名到期多少天可以转移
- 国际域名续费后多少天转移
- Opera浏览器现在允许只使用表情符号的网页地址
- HaaS技术社区大玩家,研究十几年嵌入式独爱HaaS
- Ubuntu 20.04 下安装配置 Grub2 图形化界面工具
- Linux 中 Ncat 命令使用实例,你知道几个?
- 阿里云新品发布会周刊第112期 丨 空中架构师云速搭CADT全新发布
- 想打开Windows 10隐藏的神秘功能吗,请打开操作系统的隐藏“模式”
- HaaS Lab – 云上开发板让物联网开发更简单
- 如何在RTOS上全量支持C++11
- 浏览器的五种 Observer,你用过几种?
- 网站的域名租1年需要多少钱
- Netstat 还能这么玩儿?
- 通过千万交易的is.com来看单词域名的价值和市场!