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

2024-01-13 00:30

本文主要是介绍QT桌面项目(第一个应用程序 桌面壁纸软件),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

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


前言

上节课我们已经做好了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_OBJECTQPushButton 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桌面程序。

这篇关于QT桌面项目(第一个应用程序 桌面壁纸软件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/599675

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma