服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - QT实战之打开最近图片功能的实现

QT实战之打开最近图片功能的实现

2022-12-25 16:01wendy_ya C/C++

这篇文章主要为大家详细介绍了如何利用Qt和QSettings实现打开最近图片功能,文中的示例代码讲解详细,对我们学习QT有一定的帮助,感兴趣的可以了解一下

一、项目介绍

本文介绍利用Qt和QSettings实现打开最近图片功能。

二、项目基本配置

新建一个Qt案例,项目名称为“RecentPhotoTest”,基类选择“QMainWindow”,取消选中创建UI界面复选框,完成项目创建。

三、UI界面设置

无UI界面

四、主程序实现

4.1 mainwindow.h头文件

头文件中需要声明若干槽函数、变量和相应函数:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private:
    QMenu* fileMenu;
    QMenu* recentFilesMenu;
 
    QAction* openAction;
    QList<QAction*> recentFileActionList;
    const int maxFileNr=5;
 
    QString currentFilePath;
    QLabel *imageLabel;
 
    void loadFile(const QString& filePath);
    void adjustForCurrentFile(const QString& filePath);
    void updateRecentActionList();

4.2 mainwindow.cpp源文件

需要在构造函数中添加如下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
imageLabel = new QLabel;
setCentralWidget(imageLabel);//设置中心部件
//Open Action
openAction = new QAction(tr("&Open..."), this);//open
openAction->setShortcuts(QKeySequence::Open);  //设置快捷键
connect(openAction, &QAction::triggered, this, [=]()
{
    QString filePath = QFileDialog::getOpenFileName(
                       this, tr("Open File"), "",
                       tr("Images (*.png *.xpm *.jpg *.gif)"));
    if (!filePath.isEmpty())
        loadFile(filePath);
});
 
//recentFile Action
QAction* recentFileAction = nullptr;
for(auto i = 0; i < maxFileNr; ++i){
    recentFileAction = new QAction(this);
    recentFileAction->setVisible(false);
 
    connect(recentFileAction, &QAction::triggered, this, [=]()
    {
        loadFile(recentFileAction->data().toString());
    });
    recentFileActionList.append(recentFileAction);
}
 
// create menus
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(openAction);
 
recentFilesMenu = fileMenu->addMenu(tr("Open Recent"));
for(auto i = 0; i < maxFileNr; ++i)
    recentFilesMenu->addAction(recentFileActionList.at(i));
 
updateRecentActionList();
 
resize(350, 250);//调整尺寸

新建一个imageLabel,用于图片显示;新建Open Action和RecentFile Action,将这两个action与相应的槽函数相连,然后在菜单栏上创建File和Open Recent菜单,用于承接相应的action,最后更新RecentActionList及调整尺寸。

当点击Open菜单时,选择图像并在界面中进行显示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//加载图片
void MainWindow::loadFile(const QString &filePath){
    QFile file(filePath);
    //如果不能打开
    if (!file.open(QFile::ReadOnly)) {
        QMessageBox::warning(this, tr("Recent Photos"),
                             tr("This file could not be found:\n%1.")
                             .arg(filePath));
        return;
    }
 
    QPixmap pMap(filePath);
    //如果图片为空
    if (pMap.isNull()) {
        QMessageBox::information(this, tr("Recent Photos"),
                      tr("Cannot load:\n%1.")
                      .arg(filePath));
        return;
    }
 
    imageLabel->setPixmap(pMap);                //显示图像
    imageLabel->setAlignment(Qt::AlignCenter);  //居中对齐
    adjustForCurrentFile(filePath);
}

调整菜单中最近文件的位置,使得每次新打开的文件都在RecentFile Action菜单栏的最上方:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//调整当前文件(使得每次新打开的文件都在最上方)
void MainWindow::adjustForCurrentFile(const QString &filePath){
    currentFilePath = filePath;
    setWindowFilePath(currentFilePath);
 
 
    QSettings settings("Recently", "Recent Photos");
    QStringList recentFilePaths = settings.value("recentPhotos").toStringList();//获取键对应的值
    recentFilePaths.removeAll(filePath);    //移除filePath
    recentFilePaths.prepend(filePath);      //在开头增加filePath
    //如果尺寸超过最大尺寸,则删除最后一项
    while (recentFilePaths.size() > maxFileNr)
        recentFilePaths.removeLast();
    settings.setValue("recentPhotos", recentFilePaths);//设置键recentPhotos对应的值
 
    updateRecentActionList();
}

最后更新RecentActionList,使得每次打开的图片都放到RecentActionList中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//更新recentFileActionList
void MainWindow::updateRecentActionList(){
    QSettings settings("Recently", "Recent Photos");
    QStringList recentFilePaths = settings.value("recentPhotos").toStringList();//获取键对应的值
 
    auto itEnd = 0;
    if(recentFilePaths.size() <= maxFileNr)
        itEnd = recentFilePaths.size();
    else
        itEnd = maxFileNr;
 
    for (auto i = 0; i < itEnd; ++i) {
        QString strippedName = QFileInfo(recentFilePaths.at(i)).fileName();//返回文件名(不包含路径)
        recentFileActionList.at(i)->setText(strippedName);  //描述性文本
        recentFileActionList.at(i)->setData(recentFilePaths.at(i)); //数据
        recentFileActionList.at(i)->setVisible(true);
    }
 
    for (auto i = itEnd; i < maxFileNr; ++i)
        recentFileActionList.at(i)->setVisible(false);
}

五、效果演示

完整效果如下:

QT实战之打开最近图片功能的实现

到此这篇关于QT实战之打开最近图片功能的实现的文章就介绍到这了,更多相关QT打开图片内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/didi_ya/article/details/125267412

延伸 · 阅读

精彩推荐
  • C/C++c语言指针之二级指针示例

    c语言指针之二级指针示例

    这篇文章主要介绍了c语言指针中的二级指针示例,需要的朋友可以参考下...

    C语言程序设计5082021-01-18
  • C/C++C语言对栈的实现基本操作

    C语言对栈的实现基本操作

    栈只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作,这篇文章主要介绍了C语言对...

    C语言中文网12632021-04-18
  • C/C++C语言实现扑克牌计算24点

    C语言实现扑克牌计算24点

    这篇文章主要为大家详细介绍了C语言如何实现扑克牌计算24点,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    亦文梦之4242021-08-04
  • C/C++C++通过Callback向C#传递数据的方法

    C++通过Callback向C#传递数据的方法

    下面小编就为大家分享一篇C++通过Callback向C#传递数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    特务小强9332022-02-17
  • C/C++C语言中的pause()函数和alarm()函数以及sleep()函数

    C语言中的pause()函数和alarm()函数以及sleep()函数

    这篇文章主要介绍了C语言中的pause()函数和alarm()函数以及sleep()函数,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网6622021-03-11
  • C/C++Linux C 时间函数应用

    Linux C 时间函数应用

    本文是关于Linux C时间函数 time_t struct tm 进行了详细的分析介绍并有应用实例,希望能帮到有需要的同学...

    C语言教程网5342021-04-09
  • C/C++C++实现LeetCode(53.最大子数组)

    C++实现LeetCode(53.最大子数组)

    这篇文章主要介绍了C++实现LeetCode(53.最大子数组),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang3572021-11-29
  • C/C++C++实现屏幕截图(全屏截图)

    C++实现屏幕截图(全屏截图)

    屏幕截图已经成为了所有IM即时通讯软件的必备模块,也是日常办公中使用最频繁的功能之一。今天我们从C++开发的角度,来看看屏幕截图的主要功能点是...

    link-初扬11062022-02-21