Qt项目DeskGirl开发
正文
不能播放gif,太大了,给个静态图片吧,实际上桌面壁纸是动态的,人物也是动态的,可自定义桌面壁纸,有默认的数字时钟壁纸
无边框背景透明窗体
设置属性
this->setWindowFlags(Qt::FramelessWindowHint); //去掉标题栏
this->setAttribute(Qt::WA_TranslucentBackground); //设置背景透明
设置窗体png
在主Widget
上拖一个Widge
控件,然后设置Widget的窗体,以「qss」的形式设置窗体的背景图
ui->widget->setStyleSheet(QString("background-image:url(:/src/action1/%1.png);").arg(1));
因为要设置动态图,所以用一个定时器循环设置窗体的背景图
定时器
/*动态人物*/
QTimer* frameTimer;
frameTimer = new QTimer;
connect(frameTimer,SIGNAL(timeout()),this, SLOT(frame_refreshTime()));
frameTimer->start(500);
定时器循环设置窗体背景图
void Widget::frame_refreshTime()
{
static int frame = 1;
frame = frame%4 + 1;
//qDebug()<<"frame:"<<frame;
if(status==0) {
ui->widget->setStyleSheet(QString("background-image:url(:/src/action1/%1.png);").arg(frame));
}
else if(status==1){
ui->widget->setStyleSheet(QString("background-image:url(:/src/action2/%1.png);").arg(frame));
}
else {
ui->widget->setStyleSheet(QString("background-image:url(:/src/action3/%1.png);").arg(frame));
}
}
这里「status」是人物状态,0喜,1怒,2哀
这样一个不规则窗体就设置完成了,加上小姐姐动态图组,nice
Setting设计
项目->右键->Add New->选择Qt->选择Qt Desiger Form->选择Widget UI是这样设计的
为什么是花花绿绿的呢,这个「设置样式表」,直接copy我的就行
人物状态选项
这个直接绑定信号与槽,让主界面和setting界面进行数据传递 Setting界面定义信号,check按钮之后发送信号
signals:
//定义status发送信号,widget槽函数收收
void status_check_index(int index);
void Setting::slot_RadioButton_checket(int ButtonId)
{
//发送status信号
emit status_check_index(ButtonId);
}
Widget绑定信号
/*应用菜单*/
Setting* setting;
setting = new Setting;
//绑定设置的status信号
connect(setting,SIGNAL(status_check_index(int)),this,SLOT(Setting_status_change(int)));
这样就完成了两个窗体的交互
设置桌面壁纸
简单来说就是找到桌面Program Manager,给桌面发送0x52c消息,让它接触父子关系,然后将自己写好的窗口和它建立父子关系SetParent
获取桌面句柄
这里直接封装成几个函数,然后调用,具体看源码
SendMessageToDesktop(); //发送消息,解除父子关系
this->desktopWnd=findDesktopIconWnd(); //获取桌面句柄
建立父子关系
这里以单独的背景图片为例,没有数字时钟的
void Setting::on_select_pushButton_clicked()
{
srcLabel->setParent(bkWidget);
srcLabel->setGeometry(0,0,1920,1080);
srcLabel->setScaledContents(true); //是否缩放
srcPath =QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("选择文件"),"",
QString::fromLocal8Bit("媒体文件( *.gif *.jpg *.png)"));
if(srcPath != "" && (srcPath.contains(".jpg")||srcPath.contains(".png")))//jpg,png
{
srcLabel->setPixmap(QPixmap(srcPath));
if(desktopWnd) //设置父窗体为桌面
{
SetParent((HWND)bkWidget->winId(), desktopWnd);
qDebug()<<"over";
}
bkWidget->setWindowFlags(Qt::FramelessWindowHint); //无边框
bkWidget->showFullScreen(); //全屏
qDebug()<<"success";
return;
}
因为要显示图片。所以给bkWidget添加一个Qlabel,相关设置之后,就是将用户选择的图片路径给srcLabel去显示。
设置父窗体为桌面先判断是否找到桌面,然后再给桌面设置自己的Widget为它的父亲,这样就完成了桌面壁纸的设置
数字时钟壁纸
MyClock
这是自己重写的QWidget类MyClock
,主要完成的是绘制问题,设置锚点,然后绘制,个中计算复杂,这里就不一一介绍,详情看源码
将MyClock设置到桌面
void Setting::on_apply_pushButton_clicked()
{
if(desktopWnd) //设置父窗体为桌面
{
SetParent((HWND)LabWidget->winId(), desktopWnd);
}
LabWidget->setWindowFlags(Qt::FramelessWindowHint); //无边框
LabWidget->showFullScreen(); //全屏
}
这里要无边框全屏显示,否则显示不全
动态壁纸
动态壁纸就是将与桌面建立父子关系的Widget显示视频,这个就需要视频解码,Qt自带的QMediaPlayer
虽然也能解码,但是视频解码的种类拙荆见肘,我就记的可以解码一个.avi格式的视频 那如果想要显示mp4,WMV等等格式的视频
推荐「libvlc」
VLC是一个「免费的开源跨平台多媒体播放器和框架」,可播放大多数多媒体文件以及 DVD,音频CD,VCD和各种流媒体协议。从技术上讲,它是一个软件包,可以处理计算机和网络上的媒体。它提供直观的 API和模块化架构,可轻松添加对新编解码器,容器格式和传输协议的支持。来自 VLC的大多数已知软件包是Windows,Linux和 OSX上常用的播放器。 ❞
这里我先给出本期项目的GitHub地址,然后欢迎Star,如果有Star的话,这个项目我会继续增加完善功能,最少整个vlc动态壁纸,上次的NodePad一堆的Bug,没有兴趣去解决,以后无聊了在去解决
「DeskGirl」 :给我个Star
https://github.com/ADeRoy/DeskGirl
「数字时钟」:
这个是以前写的,花里胡哨,没啥卵用,不过也可以看一下,放在DeskGirl里面
关键字【DeskGirl】
End
作者:梦凡
梦想在,终不凡~
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu16.04安装Jenkins的方法图文详解
- leetcode树之对称二叉树
- linux 上在指定时间段内每隔多少分钟自动执行任务计划crontab
- 详解如何使用Spark和Scala分析Apache访问日志
- Centos 7.4中的远程访问控制的实现方法
- Linux查找特定程序whereis实例详解
- SpringBoot实战(二):SpringMvc接收xml请求
- CentOS环境下安装PHPUnit的方法分析
- Centos下安装Ansible的示例代码
- ubuntu18.04安装搜狗拼音的简易教程
- linux中$符号的基础用法总结
- Linux下的 mariadb 使用 root 用户启动方式(推荐)
- window与linux项目部署之linux文件路径不存在问题
- Ubuntu 18.04安装 pyenv、pyenv-virtualenv、virtualenv、Numpy、SciPy、Pillow、Matplotlib
- Linux使用 iftop 实时监控网卡的流量