专栏首页编程学习基地Qt项目DeskGirl开发

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


作者:梦凡

梦想在,终不凡~

本文分享自微信公众号 - 编程学习基地(LearnBase),作者:DeRoy

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面向对象

    这期介绍C++面向对象的知识点,带你面向对象,今天是情人节,不用担心没对象,new一个,有了对象就会累(类),所以我还会介绍类

    DeROy
  • 继承

    虚继承是为了解决棱形继承中成员访问的二义性。在A B继承方式前加关键字virtual,编译器将Base的数据保存在一个公共位置,通过虚基表访问。

    DeROy
  • 拷贝构造

    拷贝构造特殊构造函数类型转换构造拷贝构造类型转换构造和拷贝构造示例关键字 explicit深拷贝和浅拷贝浅拷贝----复制地址深拷贝----复制内存何时需要自定...

    DeROy
  • JavaSE 基础学习之六 —— Java 的反射操作

    万事万物都是对象。我们平常接触到的类,本身也是一种对象,它的类型是 Class,也可以说 Class 是类的类型,即类类型 (Class Type);任何一个类...

    剑影啸清寒
  • .NET Core 3.0之深入源码理解Kestrel的集成与应用(一)

    ASP.NET Core 的 Web 服务器默认采用Kestrel,这是一个跨平台、轻量级的Web服务器(需要指出的是从 ASP.NET Core 2.1 开始...

    Edison.Ma
  • 在Web上登录Domino后直接打开用户的邮件

    /**  * <p>Title: MailRedirectServlet</p>  * <p>Description: 登录Domino服务器后直接打开用户的邮...

    阿敏总司令
  • CAS算法和ABA问题

    用户5927264
  • SpringMVC参数校验

    我们在做Web层的时候,接收了各种参数,尽管前端已经做了验证,但难免恶意传参,所以要对传过来的数据保持不信任的态度来进行参数校验

    晚上没宵夜
  • “小米们”的逃离

    在中国互联网圈,有一个广为流传的段子:如果哪天全国的互联网都瘫痪了,那一定是后厂村大堵车了。恰巧,不久前镁客网受邀去北京参加新品发布会,地点就在后厂村。

    镁客网
  • Spring Boot 整合 elasticsearch

    我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的 首选。他可以快速的存储、搜索和分析海量数据。Spring Boot通过...

    程序员果果

扫码关注云+社区

领取腾讯云代金券