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

简介: 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_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桌面程序。

相关文章
|
4天前
|
网络协议 容器
【qt】 TCP编程小项目
【qt】 TCP编程小项目
11 0
|
1月前
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
148 3
|
5天前
【qt】项目移植
【qt】项目移植
6 0
【qt】项目移植
|
11天前
【Qt项目专栏】贪吃蛇小游戏1.0
【Qt项目专栏】贪吃蛇小游戏1.0
30 5
|
4天前
|
数据安全/隐私保护
【qt】考试系统项目
【qt】考试系统项目
12 0
|
5天前
【qt】平面CAD(计算机辅助设计 )项目 上
【qt】平面CAD(计算机辅助设计 )项目 上
6 0
|
7天前
|
XML Linux 程序员
【Qt】项目代码
【Qt】项目代码
|
1月前
|
监控 Python
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
|
1月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
|
1月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城

推荐镜像

更多