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

目录
  • 一、项目介绍
  • 二、项目基本配置
  • 三、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打开文档的资料请关注我们其它相关文章!

(0)

相关推荐

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

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用Qt和QSettings实现打开最近图片功能. 二.项目基本配置 新建一个Qt案例,项目名称为“RecentPhotoTest”,基类选择“QMainWindow”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.1 mainwindow.h头文件 头文件中

  • C++ qt实现打开关闭状态按钮的代码

    效果图: 上述这种按钮,用QCheckBox可以实现,只要在选择与未选择的状态设置不同的图片即可:选择 未选择 实现代码 #include "widget.h" #include "ui_widget.h" #include <QMessageBox> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); ui->

  • Qt实战案例之如何利用QProcess类实现启动进程

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 4.1widget.h头文件 4.2widget.cpp源文件 五.效果演示 Qt提供了一个QProcess类用于启动外部程序并与之通信,启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可. 一.项目介绍 利用QProcess类实现启动进程的功能(以记事本程序为例). 二.项目基本配置 新建一个Qt案例,项目名称为“ProcessTest”,基类选择“QWidget”,点击选中创建UI界面复选框,

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

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 4.3 main.cpp 五.效果演示 一.项目介绍 本文介绍利用Qt实现打开最近文档功能,并实现基本的新建.打开.保存.退出.帮助等功能. 二.项目基本配置 新建一个Qt案例,项目名称为“RecentTest”,基类选择“QMainWindow”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.

  • Java在线打开word文档并强制留痕的方法

    前言: 在OA系统中,时不时的都会伴随着文档流转过程. 比如有的系统中会有领导审批的流程,那么在A领导审批完成后,他的审批痕迹能不能强制保留下来,以供下一步处理文档的专员清晰地参考呢? 我们知道,在本地office打开的文档中,如果点击 审阅---修订,就会将编辑的记录跟踪下来留下痕迹. 我们在线办公的系统中能不能直接将这一步由我们系统来做,避免出现用户操作不一致最终没留下痕迹的现象呢? 这些需求在分析后看似很复杂,甚至想要实现时摸不着头脑. 本篇文章直接介绍一个中间件技术-----pageof

  • WinForm项目中添加帮助文档功能

    1. F1弹出帮助文档 先找个后缀是pdf.docx等格式的的帮助文档,将它放在项目的helpDoc下. 设置其“复制到输出目录”属性为“如果较新则复制”. 在页面上添加一个HelpProvider 控件 在Load事件中加入两行代码: 设置HelpProvider所对应的帮助文档,并设置在窗体中按下F1时打开帮助文档. helpProvider1.HelpNamespace = Application.StartupPath + @"\helpDoc\帮助.pdf"; helpPro

  • 利用C#实现合并Word文档功能

    目录 程序环境 通过插入完整文件来合并文档 完整代码 效果图 通过克隆内容合并文档 完整代码 效果图 合并Word文档可以快速地将多份编辑好的文档合在一起,避免复制粘贴时遗漏内容,以及耗费不必要的时间,同时,也方便了人们阅读或者对其进行再次修改.例如,在我们进行团队作业的时候,每个人都会有不同的分工,此时,每个人都需要完成自己的文档,利用合并文件功能就可以快速地将所有内容集合在一起,方便了对内容的修改.本文将分为以下两部分介绍如何通过C#合并Word文档,并附上VB.NET代码供大家参考. 通过

  • PHPExcel导出2003和2007的excel文档功能示例

    本文实例讲述了PHPExcel导出2003和2007的excel文档功能.分享给大家供大家参考,具体如下: require_once 'common/excel/PHPExcel.php'; require_once 'common/excel/phpExcel/Writer/Excel2007.php'; require_once 'common/excel/phpExcel/Writer/Excel5.php'; include_once 'common/excel/phpExcel/IOF

  • JavaScript打开word文档的实现代码(c#)

    在C#中打开word文档其实不算太难,方法也比较多. 一.C#中打开word文档方法 复制代码 代码如下: //在项目引用里添加上对Microsoft Word 11.0 object library的引用 private void button1_Click(object sender, System.EventArgs e) { //调用打开文件对话框获取要打开的文件WORD文件,RTF文件,文本文件路径名称 OpenFileDialog opd = new OpenFileDialog()

  • C# winform打开Excel文档的方法总结(必看篇)

    C#打开Excel文档方法一:调用Excel的COM组件 在项目中打开Add Reference对话框,选择COM栏,之后在COM列表中找到"Microsoft Excel 11.0 Object Library"(Office 2003),然后将其加入到项目的References中即可.Visual C#.NET会自动产生相应的.NET组件文件,以后即可正常使用. 按钮的点击事件如下: privatevoid button1_Click(object sender, EventArg

  • javascript打开word文档的方法

    首先我们新建一个html文件,并且写一个FileUpLoad以及button控件. 代码如下: 复制代码 代码如下: <input id="flUpload" type="file" />fileUpload <input id="btnOpenFile" type="button" value="button" onclick="OpenFile()" /> 然

  • js打开word文档预览操作示例【不是下载】

    本文实例讲述了js打开word文档预览操作.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> function openmydoc(path) { var doc = new ActiveXObject("

随机推荐