c/c++语言开发共享QT实战之打开最近文档功能的实现

一、项目介绍本文介绍利用qt实现打开最近文档功能,并实现基本的新建、打开、保存、退出、帮助等功能。二、项目基本配置新建一个qt案例,项目名称为“recenttest”,基类选择

一、项目介绍

c/c++开发分享QT实战之打开最近文档功能的实现介绍利用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实战之打开最近文档功能的实现的详细内容,更多关于qt打开文档的资料请关注<计算机技术网(www.ctvol.com)!!>其它相关文章!

需要了解更多c/c++开发分享QT实战之打开最近文档功能的实现,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1237854.html

(0)
上一篇 2022年9月11日
下一篇 2022年9月11日

精彩推荐