一、项目介绍
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打开文档的资料请关注<计算机技术网(www.ctvol.com)!!>其它相关文章!
需要了解更多c/c++开发分享QT实战之打开最近文档功能的实现,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/1237854.html