返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >QT实战之打开最近文档功能的实现
  • 841
分享到

QT实战之打开最近文档功能的实现

2024-04-02 19:04:59 841人浏览 八月长安
摘要

目录一、项目介绍二、项目基本配置三、UI界面设置四、主程序实现4.1 mainwindow.h头文件4.2 mainwindow.cpp源文件4.3 main.cpp五、效果演示一、

一、项目介绍

本文介绍利用Qt实现打开最近文档功能,并实现基本的新建、打开、保存、退出、帮助等功能。

二、项目基本配置

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

三、UI界面设置

无UI界面

四、主程序实现

4.1 mainwindow.h头文件

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

private slots:
    void newFile();
    void open();
    void save();
    void saveAs();
    void openRecentFile();
    void about();

private:
    void createActions();
    void createMenus();
    void loadFile(const QString &fileName);
    void saveFile(const QString &fileName);
    void setCurrentFile(const QString &fileName);
    void updateRecentFileActions();
    QString strippedName(const QString &fullFileName);

    QString curFile;

    QTextEdit *textEdit;
    QMenu *fileMenu;
    QMenu *recentFilesMenu;
    QMenu *helpMenu;
    QAction *newAct;
    QAction *openAct;
    QAction *saveAct;
    QAction *saveAsAct;
    QAction *exitAct;
    QAction *aboutAct;
    QAction *aboutQtAct;
    QAction *separatorAct;
	//设置最大最近文件为5个
    enum { MaxRecentFiles = 5 };
    QAction *recentFileActs[MaxRecentFiles];

4.2 mainwindow.cpp源文件

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

    setAttribute(Qt::WA_DeleteOnClose);//当关闭时删除该组件

    textEdit = new QTextEdit;//新建TextEdit
    setCentralWidget(textEdit);//设为中心部件

    createActions();
    createMenus();
    (void)statusBar();//增加状态栏

    setWindowFilePath(QString());
    resize(400, 300);//调整尺寸大小

构造函数中的createActions()函数用于创建相应的行为,创建了New、Open、Save、Save As、最近5个文件、Exit、About和About Qt这几个Action,并设置相应的快捷键、状态栏和连接槽函数:

//创建action
void MainWindow::createActions()
{
    newAct = new QAction(tr("&New"), this);//new
    newAct->setShortcuts(QKeySequence::New);//设置快捷键
    newAct->setStatusTip(tr("Create a new file"));//设置状态栏
    connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

    openAct = new QAction(tr("&Open..."), this);//open
    openAct->setShortcuts(QKeySequence::Open);//设置快捷键
    openAct->setStatusTip(tr("Open an existing file"));//设置状态栏
    connect(openAct, SIGNAL(triggered()), this, SLOT(open()));

    saveAct = new QAction(tr("&Save"), this);//save
    saveAct->setShortcuts(QKeySequence::Save);//设置快捷键
    saveAct->setStatusTip(tr("Save the document to disk"));//设置状态栏
    connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));

    saveAsAct = new QAction(tr("Save &As..."), this);//save as
    saveAsAct->setShortcuts(QKeySequence::SaveAs);//设置快捷键
    saveAsAct->setStatusTip(tr("Save the document under a new name"));//设置状态栏
    connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));

    //5个Action(打开最近五个文件)
    for (int i = 0; i < MaxRecentFiles; ++i) {
        recentFileActs[i] = new QAction(this);
        recentFileActs[i]->setVisible(false);
        connect(recentFileActs[i], SIGNAL(triggered()),
                this, SLOT(openRecentFile()));
    }

    exitAct = new QAction(tr("E&xit"), this);//exit
    exitAct->setShortcuts(QKeySequence::Quit);//设置快捷键
    exitAct->setStatusTip(tr("Exit the application"));//设置状态栏
    connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllwindows()));

    aboutAct = new QAction(tr("&About"), this);//about
    aboutAct->setStatusTip(tr("Show the application's About box"));//设置状态栏
    connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));

    aboutQtAct = new QAction(tr("About &Qt"), this);//About &Qt
    aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));//设置状态栏
    connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
}

newFile()槽函数用于新建一个相同的窗口:

//新建界面并显示
void MainWindow::newFile()
{
    MainWindow *other = new MainWindow;
    other->show();
}

open()槽函数用于打开并加载文档:

//打开文件
void MainWindow::open()
{
    QString fileName = QFileDialog::getOpenFileName(this);
    if (!fileName.isEmpty())
        loadFile(fileName);
}

loadFile()函数:

//加载文件
void MainWindow::loadFile(const QString &fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        QMessageBox::warning(this, tr("Recent Files"),
                             tr("Cannot read file %1:\n%2.")
                             .arg(fileName)
                             .arg(file.errorString()));
        return;
    }

    QTextStream in(&file);

    QGuiApplication::setOverrideCursor(Qt::WaitCursor);//等待光标
    textEdit->setPlainText(in.readAll());//设置文本
    QGuiApplication::restoreOverrideCursor();//撤销最后一个光标

    setCurrentFile(fileName);
    statusBar()->showMessage(tr("File loaded"), 2000);
}

setCurrentFile()函数用于设置当前文件关联路径:

//设置当前文件
void MainWindow::setCurrentFile(const QString &fileName)
{
    curFile = fileName;
    setWindowFilePath(curFile);//设置关联文件路径

    QSettings settings;
    QStringList files = settings.value("recentFileList").toStringList();
    files.removeAll(fileName);//移除所有文件名
    files.prepend(fileName);//在开头附加子串
    //如果尺寸超过最大尺寸,则删除最后一项
    while (files.size() > MaxRecentFiles)
        files.removeLast();

    settings.setValue("recentFileList", files);//设置键值对

    foreach (QWidget *widget, QApplication::topLevelWidgets()) {
        MainWindow *mainWin = qobject_cast<MainWindow *>(widget);
        if (mainWin)
            mainWin->updateRecentFileActions();//更新最近文件
    }
}

updateRecentFileActions()函数更新最近文件信息

void MainWindow::updateRecentFileActions()
{
    QSettings settings;
    QStringList files = settings.value("recentFileList").toStringList();//读取recentFileList的值

    int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);//计算两者的最小值

    for (int i = 0; i < numRecentFiles; ++i) {
        QString text = tr("&%1 %2").arg(i + 1).arg(strippedName(files[i]));//序号 文件名
        recentFileActs[i]->setText(text);//设置文本
        recentFileActs[i]->setData(files[i]);//设置数据
        recentFileActs[i]->setVisible(true);//设置可见性
    }
    for (int j = numRecentFiles; j < MaxRecentFiles; ++j)
        recentFileActs[j]->setVisible(false);//其他数量设置为不可见

    separatorAct->setVisible(numRecentFiles > 0);//如果有最近未见则设置分隔符为可见
}

strippedName()函数用于获取相应的文件名:

//获取文件名
QString MainWindow::strippedName(const QString &fullFileName)
{
    return QFileInfo(fullFileName).fileName();//返回文件名
}

save()函数和saveAs()槽函数用于将文档进行保存:

//保存文件
void MainWindow::save()
{
    if (curFile.isEmpty())
        saveAs();//如果curFile为空,则设置保存为
    else
        saveFile(curFile);
}
//保存为
void MainWindow::saveAs()
{
    QString fileName = QFileDialog::getSaveFileName(this);
    if (fileName.isEmpty())
        return;

    saveFile(fileName);
}

saveFile()函数:

void MainWindow::saveFile(const QString &fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, tr("Recent Files"),
                             tr("Cannot write file %1:\n%2.")
                             .arg(fileName)
                             .arg(file.errorString()));
        return;
    }

    QTextStream out(&file);
    QGuiApplication::setOverrideCursor(Qt::WaitCursor);//等待光标
    out << textEdit->toPlainText();//将文本写入
    QGuiApplication::restoreOverrideCursor();//撤销最后一个光标

    setCurrentFile(fileName);
    statusBar()->showMessage(tr("File saved"), 2000);//状态栏显示2000ms
}

openRecentFile()槽函数用于打开最近的文件:

//打开最近文件
void MainWindow::openRecentFile()
{
    QAction *action = qobject_cast<QAction *>(sender());
    if (action)
        loadFile(action->data().toString());
}

about()槽函数显示相关信息:

//about
void MainWindow::about()
{
   QMessageBox::about(this, tr("About Recent Files"),
            tr("The <b>Recent Files</b> example demonstrates how to provide a "
               "recently used file menu in a Qt application."));
}

构造函数中的createMenus()函数用于创建相应的菜单栏:

void MainWindow::createMenus()
{
    fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(newAct);
    fileMenu->addAction(openAct);
    fileMenu->addAction(saveAct);
    fileMenu->addAction(saveAsAct);
    separatorAct = fileMenu->addSeparator();//增加分隔符
    for (int i = 0; i < MaxRecentFiles; ++i)
        fileMenu->addAction(recentFileActs[i]);
    fileMenu->addSeparator();               //增加分隔符
    fileMenu->addAction(exitAct);
    updateRecentFileActions();

    menuBar()->addSeparator();

    helpMenu = menuBar()->addMenu(tr("&Help"));
    helpMenu->addAction(aboutAct);
    helpMenu->addAction(aboutQtAct);
}

4.3 main.cpp

main.cpp中代码如下:

#include "mainwindow.h"
#include <QApplication>

int main(int arGC, char *argv[])
{
    QApplication a(argc, argv);
    a.setOrganizationName("Recently");         //设置组织名称
    a.setApplicationName("Recent Files");       //设置标题名称

    MainWindow w;
    w.show();
    return a.exec();
}

【注意】

在mainwindow.cpp中QSettings settings;语句用于构造QSettings对象。

代码:

QCoreApplication::setOrganizationName("Recently");         //设置组织名称
QCoreApplication::setApplicationName("Recent Files");       //设置标题名称
QSettings settings;

等价于

QSettings settings("Recently", "Recent Files");

如果之前未调用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName(),则QSettings对象将无法读取或写入任何设置,status()将返回AccessError。

五、效果演示

完整效果如下:

以上就是QT实战之打开最近文档功能的实现的详细内容,更多关于QT打开文档的资料请关注编程网其它相关文章!

--结束END--

本文标题: QT实战之打开最近文档功能的实现

本文链接: https://lsjlt.com/news/151600.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • QT实战之打开最近文档功能的实现
    目录一、项目介绍二、项目基本配置三、UI界面设置四、主程序实现4.1 mainwindow.h头文件4.2 mainwindow.cpp源文件4.3 main.cpp五、效果演示一、...
    99+
    2024-04-02
  • QT实战之打开最近图片功能的实现
    目录一、项目介绍二、项目基本配置三、UI界面设置四、主程序实现4.1 mainwindow.h头文件4.2 mainwindow.cpp源文件五、效果演示一、项目介绍 本文介绍利用Q...
    99+
    2024-04-02
  • Python+OpenCV实战之实现文档扫描
    目录1.效果展示2.项目准备3.代码的讲解与展示4.项目资源5.项目总结与评价1.效果展示 网络摄像头扫描:   图片扫描:  最终扫描保存的图片: &n...
    99+
    2024-04-02
  • Qt音视频开发之视频文件保存功能的实现
    目录一、前言二、效果图三、体验地址四、相关代码五、功能特点5.1 基础功能5.2 特色功能5.3 视频控件5.4 内核ffmpeg一、前言 和音频存储类似,视频的存储也对应三种格式,...
    99+
    2022-12-08
    Qt视频文件保存 Qt视频保存 Qt 文件保存
  • C#怎么实现完整文档打印功能
    这篇文章主要讲解了“C#怎么实现完整文档打印功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现完整文档打印功能”吧!C#打印程序实现完整文档打印功能,我们会介绍打印操作具体包括的...
    99+
    2023-06-17
  • Qt项目实战之实现多文本编辑器
    首先先来看实验成果图,大概就是这么个多文档编辑器。 首先需要在设计模式里进行设计器的设置: 然后就是新建类MdiChild的声明和实现 mdichild.h #ifndef MD...
    99+
    2023-03-19
    Qt多文本编辑器 Qt文本编辑器 Qt编辑器
  • Mongodb实战之全文搜索功能
    前言 众所周知在传统的关系型数据库中,我们通常将数据结构化,通过一系列表关联、聚合来查询我们所需的结果。而在非结构化的数据中,缺少这种预定义的结构,因而如何快速查询定位到我们所需要的结果,不是一件容易的事。...
    99+
    2024-04-02
  • Qt项目实战之方块游戏的实现
    目录1.方块游戏架构2.游戏逻辑3.效果图4.具体实现1.方块游戏架构 在这个游戏中,有一个区域用来摆放方块,该区域宽为10,高为20,以小正方形为单位,它可以看作是拥有20行10列...
    99+
    2023-03-19
    Qt实现方块游戏 Qt方块游戏 Qt游戏
  • Redis如何实现“附近的人”功能
    这篇文章给大家分享的是有关Redis如何实现“附近的人”功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL...
    99+
    2024-04-02
  • 使用redis实现附近的人功能
    目录前言工具一、测试数据二、基本命令三、javaApi前言 Redis自3.2版本开始提供了GEO(geograph)功能,支持地理位置相关操作,以实现诸如附近的人这类依赖于地理位置...
    99+
    2024-04-02
  • Go语言实战之实现均衡器功能
    目录前言负载均衡轮询算法加权轮询算法最少连接数算法详细实现前言 当我们需要处理成千上万的的用户请求时,当一台服务器可能无法满足这千万级别的请求时就可能需要扩容,增加服务器的数量来维持...
    99+
    2023-05-15
    Go实现均衡器功能 Go均衡器功能 Go均衡器
  • jQuery.cookie.js怎么实现记录最近浏览过的商品功能
    这篇文章主要介绍jQuery.cookie.js怎么实现记录最近浏览过的商品功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:1、jquery.cookie.js jque...
    99+
    2024-04-02
  • Python机器学习实战之k-近邻算法的实现
    目录K-近邻算法概述工作原理实施KNN算法示例:手写识别系统K-近邻算法概述 简单地说, k-近邻算法采用测量不同特征值之间的距离方法进行分类。 k-近邻算法 优点:精度高...
    99+
    2024-04-02
  • Android实战教程第三篇之简单实现拨打电话功能
    本文实例为大家分享了Android打电话功能的实现代码,需要一个文本输入框输入号码,需要一个按钮打电话。 本质:点击按钮,调用系统打电话功能。 xml布局文件代码:: &...
    99+
    2022-06-06
    电话 教程 Android
  • Qt编写地图之实现跨平台功能
    目录一、前言二、功能特点1 省市区域地图封装类功能特点2 百度地图封装类功能特点3 离线地图下载类功能特点4 省市轮廓下载类功能特点三、体验地址四、效果图五、相关代码一、前言 跨平台...
    99+
    2024-04-02
  • PHP开发实战:打造高效多篇文章点赞功能
    对不起,我不能提供具体的编程代码示例。如果您需要关于PHP开发实战的指导或者建议,我很乐意为您提供。请告诉我您需要哪方面的帮助,我会尽量提供相关信息。以上就是PHP开发实战:打造高效多...
    99+
    2024-02-27
    php 点赞 多篇文章
  • 利用C#实现合并Word文档功能
    目录程序环境通过插入完整文件来合并文档 完整代码效果图通过克隆内容合并文档 完整代码效果图合并Word文档可以快速地将多份编辑好的文档合在一起,避免复制粘贴时遗漏...
    99+
    2022-12-08
    C#合并Word文档 C#合并Word C# 合并 文档
  • MySQL DML操作--------实现pivot行转列功能最佳实战
    1. 背景  * 由于MySQL 不支持类型Oracle与SQL Server的pivot功能进行行列转换。2. 表与数据mysql> select * fro...
    99+
    2024-04-02
  • 实现C#打印文档的步骤
    本篇内容主要讲解“实现C#打印文档的步骤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“实现C#打印文档的步骤”吧!C#打印文档操作方式:C#打印文档1.新建一个项目项目中有两个form(Form...
    99+
    2023-06-17
  • Qt实现小功能之复杂抽屉效果详解
    目录功能讲解自定义标题widget标题名称控件的创建QCheckBox控件的创建自定义内容Widget创建显示高度描述控件QScrollArea中widget实现QScrollAre...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作