QT桌面项目(第一个应用程序 桌面壁纸软件)

news2025/1/1 21:54:35

文章目录

  • 前言
  • 一、壁纸切换程序的布局
  • 二、添加资源文件
  • 三、代码编写
  • 四、主界面代码
  • 五、程序的编写思路
  • 六、程序效果
  • 总结


前言

上节课我们已经做好了APP的按键图标了,这篇文章就让我们来开始制作第一个桌面程序吧。

一、壁纸切换程序的布局

这个是windows上浏览器查看图片的界面,看起来是非常的简单明了的,在旁边有两个前进和后退的按键用来控制图片的更换,中间是用来显示图片的部分,这个部分我们使用一个QWidget来显示即可。
背景颜色可以使用QQ的截图查看RGB,当然了也可以根据自己的喜好来设置。
在这里插入图片描述

二、添加资源文件

首先要将背景图添加到资源文件当中:

在这里插入图片描述

在这里插入图片描述

三、代码编写

创建一个类来管理壁纸界面,这个类继承于QWidget:

BcakGround.h:

#ifndef BACKGROUND_H
#define BACKGROUND_H

#include <QObject>
#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QMenu>
#include <QAction>
#include <QContextMenuEvent>

class BackGround : public QWidget
{
    Q_OBJECT

    QPushButton m_backbtn;/*向后按键*/
    QPushButton m_aheadbtn;/*向前按键*/

    QWidget p_dis;/*显示图片界面*/

    QStringList PngList;/*存放所有图片的路径*/

    int NowImageIndex;/*当前显示图片的下标*/

    QString m_ImagePath;/*当前图片相对路径*/

    QMenu* m_menu;/*菜单栏*/
    QAction* m_action;

    void GetImageName();/*得到文件夹下的全部文件相对路径并存放入链表当中保存*/

    void ShowImage(QString path);/*在当前选择界面显示对应图片*/

    void MenuInit();/*菜单栏初始化*/

public:
    explicit BackGround(QWidget *parent = nullptr);
    QString GetNowImagePath();/*提供给外部使用,得到选择的图片绝对路径*/

signals:
    void updateBackGround();/*更新背景图片信号*/
protected:
    void contextMenuEvent(QContextMenuEvent *event);

protected slots:
    void m_backbtn_clicked();
    void m_aheadbtn_clicked();
    void SetNowImagePath();
};

#endif // BACKGROUND_H

BcakGround.c:

#include "BackGround.h"
#include <QIcon>
#include <QDebug>
#include <QHBoxLayout>
#include <Qpalette>
#include <QDir>

BackGround::BackGround(QWidget *parent): QWidget{parent}, m_backbtn(this),
    m_aheadbtn(this), p_dis(this)
{
    setFixedSize(1024, 600);

    NowImageIndex = 0;

    /*设置背景颜色*/
    setAutoFillBackground(true);
    QPalette palette1;
    palette1.setColor(QPalette::Window, QColor(43, 43, 43));
    setPalette(palette1);

    // 设置 QWidget 的背景图
    QPixmap pixmap(":/BackGround/Desktop2 (1).jpg");
    QPalette palette;
    palette.setBrush(backgroundRole(), QBrush(pixmap));
    p_dis.setPalette(palette);
    p_dis.setAutoFillBackground(true);

    /*按键样式设置*/
    m_backbtn.setIcon(QIcon(":/Back.png"));
    m_backbtn.setStyleSheet("QPushButton { border-radius: 25px; min-width: 50px; min-height: 50px; "
                            "border: 0px solid black; }");
    m_backbtn.setFixedSize(50, 50);
    m_backbtn.setIconSize(m_backbtn.size());


    m_aheadbtn.setIcon(QIcon(":/ahead.png"));
    m_aheadbtn.setStyleSheet("QPushButton { border-radius: 25px; min-width: 50px; min-height: 50px; "
                            "border: 0px solid black; }");
    m_aheadbtn.setFixedSize(50, 50);
    m_aheadbtn.setIconSize(m_aheadbtn.size());

    /*界面布局*/
    QHBoxLayout* layout = new QHBoxLayout(this);
    layout->addWidget(&m_backbtn);
    layout->addWidget(&p_dis);
    layout->addWidget(&m_aheadbtn);

    GetImageName();

    MenuInit();

    connect(&m_backbtn, SIGNAL(clicked()), this, SLOT(m_backbtn_clicked()));
    connect(&m_aheadbtn, SIGNAL(clicked()), this, SLOT(m_aheadbtn_clicked()));
}

/*获得背景图的文件名*/
void BackGround::GetImageName()
{
    QDir dir("D:/QT project/wallpaper/BackGround");
    if (!dir.exists()) {
        qDebug() << "this dir is unexists";
    }
    dir.setFilter(QDir::Files | QDir::NoSymLinks);
    PngList = dir.entryList();
}

/*根据选择的文件名显示对应的图片*/
void BackGround::ShowImage(QString path)
{
    QPixmap pixmap(QString(":/BackGround/") + path);
    QPalette palette;
    palette.setBrush(backgroundRole(), QBrush(pixmap));
    p_dis.setPalette(palette);
    p_dis.setAutoFillBackground(true);
}

void BackGround::m_backbtn_clicked()
{
    if(NowImageIndex > 0)
    {
        NowImageIndex--;
    }

    ShowImage(PngList[NowImageIndex]);
}

void BackGround::m_aheadbtn_clicked()
{
    if(NowImageIndex < PngList.count() - 1)
    {
        NowImageIndex++;
    }

    ShowImage(PngList[NowImageIndex]);
}

void BackGround::MenuInit()
{
    m_menu = new QMenu(this);
    m_action = new QAction();
    m_action->setText("设置为背景图");
    m_menu->addAction(m_action);

    connect(m_action, SIGNAL(triggered()), this, SLOT(SetNowImagePath()));
}

/*得到背景图路径*/
void BackGround::SetNowImagePath()
{
    m_ImagePath = PngList[NowImageIndex];
    emit updateBackGround();
}

/*获取背景图绝对路径*/
QString BackGround::GetNowImagePath()
{
    /*得到绝对路径*/
    QString abspath = QString(":/BackGround/") + m_ImagePath;
    return abspath;
}

/*重写contextMenuEvent捕获鼠标右键事件生成菜单栏*/
void BackGround::contextMenuEvent(QContextMenuEvent *event)
{
    m_menu->exec(QCursor::pos());
    event->accept();
}


四、主界面代码

这里我们需要编写一个SetNowBackGround槽函数来接收updateBackGround信号,当接收到这个信号时更新界面。

void Widget::SetNowBackGround()
{
    QPixmap pixmap(bg->GetNowImagePath());
    QPalette palette;
    palette.setBrush(backgroundRole(), QBrush(pixmap));
    setPalette(palette);
    setAutoFillBackground(true);
}

五、程序的编写思路

代码注释已经非常详细了,这里我就主要给大家讲解一下主要的思路。

1.使用水平布局管理器布局整个界面

2.使用QDir得到图片的路径并保存到QStringList中

3.重写contextMenuEvent函数,当鼠标右键按下时出现一个菜单栏,并连接菜单栏中的QAction的triggered信号到自定义的SetNowImagePath槽函数中

4.当菜单栏中的QAction被按下时发送updateBackGround信号告诉主界面应该更新背景图了

5.主界面中定义对应的槽函数更新界面

六、程序效果

这个壁纸软件我们还可以把他做的更好,我们可以添加查找框,查找一些我们想要的背景图,或者添加一些图片的分类让我们可以直接进行选择,这些就留给大家去完善了。
在这里插入图片描述

总结

本篇文章就讲解到这里了,下面我们将持续完善我们的QT桌面程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3使用指南

vue3使用指南 主要介绍vue3的使用&#xff0c;同时会涉及到vue2&#xff0c;并会讲解其中的一些差异。 安装 CDN引入 如果想快速体验&#xff0c;可以直接通过cdn进行引入。 <div id"app">{{msg}}</div> <script src"https://unpkg.com/vue…

谷歌推出下一代大型语言模型 PaLM 2

谷歌在 2023 年度 I/O 大会上宣布推出了其下一代大型语言模型 PaLM 2&#xff0c;擅长高级推理任务&#xff0c;包括代码和数学、分类和问答、翻译和多语言能力以及自然语言生成。 谷歌声称 PaLM 2 是一种最先进的语言模型&#xff0c;要优于其之前所有的 LLM&#xff0c;包括…

网络拓扑架构规划设计

小型组网架构 1.网络拓扑 终端用户接入到交换机,交换机直连防火墙构成的简单网络,防火墙连接internet,对内网的用户进行安全控制 2.特点 用户接入数量较少:小型网络应用于接入用户数量较少的场景,一般支持几个至几十个用户 网络覆盖范围小:网络覆盖范围一般也是一个…

网络拓扑图制作软件

1.亿图图示(EdrawMax) 最像VISIO的网络拓扑制作工具 亿图图示实际上就是国产的Visio,与Visio非常相似。支持B/S架构,查看拓扑非常方便,模版也比较丰富。缺点与Visio也类似,画简单的网络拓扑没有问题,但针对大型网络拓扑管理而言,既需要能制作拓扑,又需要具有管理分析…

Hystrix详解及实践---SpringCloud组件(四)

Hystrix详解及实践 1.Hystrix简介2.雪崩问题3.服务降级、线程隔离、原理3.1.服务降级实践&#xff08;在feign的基础上实现&#xff09;1 添加Hystrix依赖2.在yml中开启熔断功能3.编写降级逻辑4.重启测试 4.服务熔断(Circuit Breaker)、原理4.1. 熔断原理4.2.动手实践 5.Hystri…

5个模板非常多的免费样机素材分享

样机素材是设计行业的不可缺少的素材之一&#xff0c;设计师可以将自己的设计作品&#xff0c;应用到一个效果图中进行展示&#xff0c;让你的设计作品看起来更加形象逼真。 本文分享5个非常给力的样机素材网站 1.即时设计资源社区 即时设计是一款「专业UI设计工具」&#x…

【edusrc】某校园网登录系统存在的一个简单爆破

前言 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 阿里云专家博主、华为网络安全云享专家、腾讯云自媒体分享计划博主 本文主讲思路&#xff0c;可能有点废话。 该漏洞已修复 最开始的思…

华为OD机试真题 Java 实现【字符串重新排序】【2023Q1 100分】

一、题目描述 给定一个字串s&#xff0c;s包含以空格分隔的若干个单词&#xff0c;请对s进行如下处理后输出&#xff1a; 1、单词内部调整 对每个单词字母重新按字典序排序。 2、单词间顺序调整: 统计每个单词出现的次数&#xff0c;并按次数降序排列&#xff1b;次数相同…

存下吧!Spring高频面试题总结

Spring是什么&#xff1f; Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 Spring的优点 通过控制反转和依赖注入实现松耦合。支持面向切面的编程&#xff0c;并且把应用业务逻辑和系统服务分开。通过切面和模板减少样板式代码。声明式事务的支持。可以从单…

Windows系统下Chromedriver.exe安装及配置

Windows系统下Chromedriver.exe安装及配置 在利用selenium工具进行Web自动化测试时&#xff0c;必须先要安装浏览器驱动&#xff0c;通常比较常用的是谷歌浏览器和火狐浏览器。 一、浏览器驱动下载地址 1.浏览器驱动官网&#xff1a;http://chromedriver.storage.googleapis…

计算环境安全

计算环境安全 操作系统安全安全机制标识与鉴别访问控制权限管理信道保护安全审计内存保护与文件系统保护 安全部署原则操作系统安全配置密码远程暴力破解安全审计 针对系统的攻击信息收集公开信息收集-搜索引擎信息收集与分析的防范 缓冲区溢出缓冲区溢出基础-堆栈、指针、寄存…

Dubbo源码篇03---点点直连如何实现及背后原理

Dubbo源码篇03---从点点直连探究Complier编译的原理 什么是点点直连实际需求如何实现动态编译&#xff1f;如何发起调用?点点直连原理实现点点直连消费端提供端测试 点点直连小结 什么是点点直连 Dubbo正常的请求模型&#xff0c;都是消费端从注册中心拉取服务提供者列表&…

spring 命令执行 (CVE-2022-22947)

漏洞原理 该漏洞产生的原因是由于&#xff0c;当AddResponseHeaderGatewayFilterFactory传入的值进行计算(getValue())的时候&#xff0c;会逐一向上调用对应的方法&#xff0c;直到进入带有SpEL表达式解析器的位置进行最后的解析&#xff0c;从而触发了SpEL表达式注入漏洞。漏…

分组背包问题 java

&#x1f351; 算法题解专栏 &#x1f351; 分组背包问题 输入 3 5 2 1 2 2 4 1 3 4 1 4 5输出 8&#x1f468;‍&#x1f3eb; 参考题解 &#x1f351; 终极简化版 import java.util.Scanner;public class 分组背包极简版 {static int N 110;static int[] f new int[N]…

【大数据之Hadoop】三十、HDFS故障排除

使用3台服务器&#xff0c;恢复yarn快照。 1 NameNode故障处理 出现NameNode进程挂了并且存储的数据也丢失了&#xff0c;怎么恢复NameNode。 故障模拟&#xff1a; &#xff08;1&#xff09;kill掉NameNode的进程&#xff1a; kill -9 进程ID&#xff08;2&#xff09;删…

SpringCloud:微服务保护之授权规则

授权规则可以对请求方来源做判断和控制。 1.授权规则 1.1.基本规则 授权规则可以对调用方的来源做控制&#xff0c;有白名单和黑名单两种方式。 白名单&#xff1a;来源&#xff08;origin&#xff09;在白名单内的调用者允许访问 黑名单&#xff1a;来源&#xff08;origi…

【JAVAEE】阻塞队列的实现

目录 阻塞队列 生产者消费者模型 消息队列 消息队列的作用 1.解耦 2.削峰填谷 3.异步 演示JDK中的阻塞队列 实现一个阻塞队列 阻塞队列 队列&#xff0c;是一种先进先出&#xff08;FIFO&#xff09;数据结构。 阻塞队列也满足队列的特性&#xff1a; 入队元素时&am…

详细版易学版TypeScript - 泛型详解

一、泛型的基本使用 泛型&#xff1a;定义时不确定是什么类型&#xff0c;就先定义为泛型&#xff0c;等到使用时再去确定具体的类型 //实现需求&#xff1a;根据传入的数据value和数量count&#xff0c;返回有count个value值的数组 const myFuncTest1 (value: number, count:…

一文搞懂Bootloader跳转到APP 的方法和原理

一 跳转方法 1、检查栈顶地址是否合法 if (((*(uint32_t*)(NRF52840_APP_BASE)) & 0xffff0000 ) 0x20040000 ){nrf_bootloader_app_start();}在编译生成的APP.bin文件中,前4个字节存放的是__initial_sp&#xff0c;紧接着第二个地址存放的是Reset_Handler&#xff1b;这两…

【机器学习】决策树(基础篇)

决策树&#xff08;基础篇---分类问题&#xff0c;回归问题会另出一篇博客,但也是基础篇&#xff09; 思维导图前言了解决策树&#xff08;前后观看&#xff09;使用决策树&#xff08;感性的认识&#xff09;如何生成决策树&#xff08;原理部分&#xff0c;此部分有局限性&am…