[Qt] 基于 Qt 的文件选择与图片显示功能实现

DevKevin 2024-10-14 16:35:02 阅读 76

文章目录

基础版本:`open1()`功能解析:特点与限制:

增加路径记忆功能:`open2()`功能解析:特点与改进:

使用智能指针优化内存管理:`open3()`功能解析:特点与改进:

图片自适应窗口:`open4()`功能解析:特点与改进:

总结1. **基本功能:图片选择与显示**2. **路径记忆功能**3. **智能指针管理内存**4. **图片自适应窗口功能**5. **版本递进思路**

在这篇博客中,我们将带领 Qt 的初学者一步步实现一个简单的图片选择与显示功能,并逐渐优化代码,从最基础的版本开始,逐步添加更多的功能。本文中使用了 Qt 中多个重要的类和函数,例如 <code>QFileDialog、QSettingsQPixmap 等。文章为每个版本的实现进行详细讲解,帮助更好地理解 Qt 的使用。

基础版本:open1()

open1() 是一个最基础的实现,用于选择图片文件并在界面上显示图片。下面是该版本的实现:

void Widget::open1()

{

// 打开文件对话框,供用户选择图片文件

// getOpenFileName() 函数的四个参数依次是:

// 1. 父组件,通常传递当前对象 this

// 2. 对话框标题

// 3. 初始打开的文件路径(此处是 D 盘根目录)

// 4. 过滤器,限制显示的文件类型(这里是 PNG 和 JPG 格式的图片)

QString filename = QFileDialog::getOpenFileName(this, "请选择图片", "D:/", "图片(*.png *.jpg)");

// 如果用户没有选择任何文件,直接返回

if(filename.isEmpty())

{

return;

}

// 将选择的文件路径显示在界面上的 QLineEdit 中

ui->lineEdit_path->setText(filename);

// 将选择的图片加载成 QPixmap 对象,并显示在 QLabel 中

ui->label_image->setPixmap(QPixmap(filename));

}

功能解析:

QFileDialog::getOpenFileName

用于显示文件选择对话框,返回所选文件的路径。如果用户取消选择,则返回空字符串。 。它返回用户选择的文件的完整路径。参数包括:

this: 父窗口指针。"请选择图片": 对话框的标题。"D:/": 初始路径,这里设置为 D: 盘。"图片(*.png *.jpg)": 过滤器,限制用户只能选择 .png.jpg 格式的图片。 QLineEdit::setText()

这个函数用于在界面上的文本框(这里是 lineEdit_path)中显示选中文件的路径。QLabel::setPixmap()

用于在标签中显示图片,将 QPixmap 对象加载的图片展示到界面上,QPixmap 对象用于加载图片。通过 setPixmap,我们可以将图片显示在 label_image 组件中。

特点与限制:

这个版本的代码实现了基础的图片选择与显示功能,但有一个明显的缺点:每次打开文件选择对话框时,路径都会重置为 D:/,不能记住上次用户选择的文件夹位置。

增加路径记忆功能:open2()

open2() 中,我们对 open1() 进行了增强,添加了保存和记忆上次打开路径的功能。为此, 通过 QSettings 类保存和读取上次使用的路径。

void Widget::open2()

{

// 获取应用程序的配置文件路径,存放在当前应用的目录下

QString config_path = qApp->applicationDirPath() + "/config/Setting.ini";

qDebug() << config_path; // 输出配置文件路径,便于调试查看

// 使用 QSettings 读取 ini 文件中的配置信息,文件不存在时会自动创建

QSettings* pIniSet = new QSettings(config_path, QSettings::IniFormat);

// 从配置文件中读取上次使用的路径,如果没有记录则返回空字符串

QString lastPath = pIniSet->value("/LastPath/path").toString();

// 如果没有上次记录的路径,使用系统默认的图片目录

if (lastPath.isEmpty())

{

// QStandardPaths::writableLocation 获取系统中常用路径

lastPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);

}

// 打开文件选择对话框,初始路径设置为 lastPath

QString filename = QFileDialog::getOpenFileName(this, "请选择图片", lastPath, "图片(*.png *.jpg)");

// 如果用户没有选择文件,直接返回

if(filename.isEmpty())

{

return;

}

// 将选择的文件路径显示在界面上的文本框中

ui->lineEdit_path->setText(filename);

// 显示选择的图片

ui->label_image->setPixmap(QPixmap(filename));

// 获取文件路径的目录部分,更新配置文件中的路径

int end = filename.lastIndexOf("/");

QString _path = filename.left(end);

pIniSet->setValue("/LastPath/path", _path);

// 删除 QSettings 对象,释放内存

delete pIniSet;

pIniSet = nullptr;

qDebug() << _path; // 输出更新后的路径,便于调试查看

}

功能解析:

QSettings

这是 Qt 提供的一个便捷的类,用于保存应用程序的配置信息,支持使用 ini 文件或者注册表。这里使用 ini 文件存储用户上次选择的路径。在这个例子中,配置文件是 Setting.ini,其中存储了用户上次打开文件的路径。

pIniSet->value("/LastPath/path").toString():读取配置中的路径值。pIniSet->setValue("/LastPath/path", _path):在用户选择完图片后,保存其路径。 QStandardPaths::writableLocation()

用于获取操作系统中特定类型的文件夹,例如图片、文档等。在这里当用户第一次打开程序时,程序会自动使用系统的图片目录作为初始路径。**QString::lastIndexOf()**** 和 ****QString::left()**

用于字符串的操作,lastIndexOf() 查找路径中的最后一个 /left() 截取文件路径的目录部分。

特点与改进:

open2()open1() 的基础上添加了路径记忆功能,每次打开文件选择对话框时,都会显示上次用户选择的文件夹,大大提高了用户体验。同时,它将路径存储在 ini 文件中,确保下次程序启动时可以继续记住路径。

使用智能指针优化内存管理:open3()

open2() 中,我们手动 newdeleteQSettings 对象,虽然这能正常工作,但容易导致内存泄漏问题。为了安全管理内存,open3() 使用了 C++11 引入的智能指针 std::unique_ptr,从而自动管理对象的生命周期。

void Widget::open3()

{

// 获取应用程序的配置文件路径,存放在当前应用的目录下

QString config_path = qApp->applicationDirPath() + "/config/Setting.ini";

qDebug() << config_path; // 输出配置文件路径,便于调试查看

// 使用 std::unique_ptr 管理 QSettings 对象,自动管理内存

std::unique_ptr<QSettings> pIniSet(new QSettings(config_path, QSettings::IniFormat));

// 从配置文件中读取上次使用的路径

QString lastPath = pIniSet->value("/LastPath/path").toString();

// 如果没有上次记录的路径,使用系统默认的图片目录

if (lastPath.isEmpty())

{

lastPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);

}

// 打开文件选择对话框,初始路径设置为 lastPath

QString filename = QFileDialog::getOpenFileName(this, "请选择图片", lastPath, "图片(*.png *.jpg)");

// 如果用户没有选择文件,直接返回

if(filename.isEmpty())

{

return;

}

// 将选择的文件路径显示在界面上的文本框中

ui->lineEdit_path->setText(filename);

// 显示选择的图片

ui->label_image->setPixmap(QPixmap(filename));

// 获取文件路径的目录部分,更新配置文件中的路径

int end = filename.lastIndexOf("/");

QString _path = filename.left(end);

pIniSet->setValue("/LastPath/path", _path);

qDebug() << _path; // 输出更新后的路径,便于调试查看

}

功能解析:

std::unique_ptr

智能指针是 C++11 引入的内存管理工具,能够在对象不再需要时自动释放内存,从而避免内存泄漏。在这里使用 std::unique_ptr 来管理 QSettings 对象的生命周期,无需手动 delete

特点与改进:

open3() 的逻辑与 open2() 基本相同,不同的是通过 std::unique_ptr 自动管理内存,避免了手动管理的复杂性,提升了代码的健壮性。

图片自适应窗口:open4()

open4() 中,我们在显示图片时进行了进一步优化,添加了使图片自适应窗口大小的功能。

void Widget::open4()

{

// 获取应用程序的配置文件路径,存放在当前应用的目录下

QString config_path = qApp->applicationDirPath() + "/config/Setting.ini";

qDebug() << config_path; // 输出配置文件路径,便于调试查看

// 使用 QSettings 读取 ini 文件中的配置信息

QSettings* pIniSet = new QSettings(config_path, QSettings::IniFormat);

// 从配置文件中读取上次使用的路径

QString lastPath = pIniSet->value("/LastPath/path").toString();

// 如果没有上次记录的路径,使用系统默认的图片目录

if (lastPath.isEmpty())

{

lastPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);

}

// 打开文件选择对话框,初始路径设置为 lastPath

QString filename = QFileDialog::getOpenFileName(this, "请选择图片", lastPath, "图片(*.png *.jpg)");

// 如果用户没有选择文件,直接返回

if(filename.isEmpty())

{

return;

}

// 将选择的文件路径显示在界面上的文本框中

ui->lineEdit_path->setText(filename);

// 使用 QPixmap 对象加载用户选择的图片

QPixmap* pix = new QPixmap(filename);

// 将图片缩放为适应 QLabel 的尺寸,但保持宽高比,保证图片不失真

pix->scaled(ui->label_image->size(), Qt::KeepAspectRatioByExpanding);

// 设置 QLabel 可以缩放显示图片(保持图片的完整性)

ui->label_image->setScaledContents(true);

// 显示缩放后的图片

ui->label_image->setPixmap(*pix);

// 释放 QPixmap 对象的内存

delete pix;

pix = nullptr;

// 获取文件路径的目录部分,更新配置文件中的路径

int end = filename.lastIndexOf("/");

QString _path = filename.left(end);

pIniSet->setValue("/LastPath/path", _path);

// 释放 QSettings 对象的内存

delete pIniSet;

pIniSet = nullptr;

qDebug() << _path; // 输出更新后的路径,便于调试查看

}

功能解析:

**QPixmap::scaled()**

该函数用于缩放图片。这里的 Qt::KeepAspectRatioByExpanding 参数表示保持图片的宽高比,在必要时扩展图片,以适应标签的大小。**QLabel::setScaledContents()**

该函数用于设置标签的显示内容是否可以缩放。如果为 true,则图片会根据标签的大小自动调整。

特点与改进:

open4() 添加了图片自适应窗口的功能,使得用户选择的图片可以根据窗口大小自动调整,不再受固定大小限制,增强了用户的视觉体验。该功能通过 QPixmap::scaled() 实现图片的缩放,并通过 QLabel::setScaledContents() 使图片能够适应标签控件的尺寸。

总结

1. 基本功能:图片选择与显示

首先,在最基本的版本 open1() 中,用户可以通过 QFileDialog::getOpenFileName() 打开文件选择对话框,选择一个图片文件(支持 .png.jpg 格式)。当用户选择图片后,程序会将图片路径显示在界面上的文本框中,并通过 QPixmap 加载并显示图片。该功能实现了最基础的图片选择与显示功能,但没有记住用户上次操作路径的能力。

2. 路径记忆功能

open2() 版本中,程序通过 QSettings 实现了路径记忆功能。程序会在配置文件 Setting.ini 中保存用户上次选择图片的路径,并在下次运行时默认打开上次路径所在的文件夹,从而提升用户体验。如果用户是首次运行或配置文件中无路径信息,程序会默认打开系统的“图片库”目录。

QSettings 通过键值对的方式在配置文件中存储和读取数据,程序通过以下步骤实现:

读取配置文件中的上次路径。如果上次路径不存在,使用默认路径。更新配置文件中的路径。

3. 智能指针管理内存

open3() 版本中,代码采用了智能指针 std::unique_ptr 来替代手动的内存管理(newdelete),以提高代码的健壮性并避免内存泄漏问题。std::unique_ptr 是 C++11 引入的智能指针类型,可以在作用域结束时自动释放内存,从而不需要手动调用 delete。这一改进使代码更加清晰,降低了错误发生的可能性。

4. 图片自适应窗口功能

open4() 版本进一步优化了图片的显示效果,使图片可以自适应窗口大小。当用户选择图片后,程序通过 QPixmap::scaled() 函数按照 QLabel 的大小对图片进行缩放,并且保持图片的宽高比,防止图片失真。此外,QLabel::setScaledContents(true) 设置让图片能够随着标签控件大小自动调整,从而提升了用户的视觉体验。

5. 版本递进思路

每个版本的改进都基于前一个版本的逻辑,逐步增加功能,增强代码可读性和用户体验:

open1():基础功能,图片选择与显示。open2():通过 QSettings 添加路径记忆功能,改善用户体验。open3():引入智能指针管理,避免内存泄漏。open4():实现图片自适应窗口大小的功能,增强视觉效果。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。