QT實(shí)戰(zhàn)之打開最近文檔功能的實(shí)現(xiàn)
一、項(xiàng)目介紹
本文介紹利用Qt實(shí)現(xiàn)打開最近文檔功能,并實(shí)現(xiàn)基本的新建、打開、保存、退出、幫助等功能。
二、項(xiàng)目基本配置
新建一個(gè)Qt案例,項(xiàng)目名稱為“RecentTest”,基類選擇“QMainWindow”,取消選中創(chuàng)建UI界面復(fù)選框,完成項(xiàng)目創(chuàng)建。
三、UI界面設(shè)置
無UI界面
四、主程序?qū)崿F(xiàn)
4.1 mainwindow.h頭文件
頭文件中需要聲明若干槽函數(shù)和相應(yīng)函數(shù):
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; //設(shè)置最大最近文件為5個(gè) enum { MaxRecentFiles = 5 }; QAction *recentFileActs[MaxRecentFiles];
4.2 mainwindow.cpp源文件
需要在構(gòu)造函數(shù)中添加如下代碼:
setAttribute(Qt::WA_DeleteOnClose);//當(dāng)關(guān)閉時(shí)刪除該組件 textEdit = new QTextEdit;//新建TextEdit setCentralWidget(textEdit);//設(shè)為中心部件 createActions(); createMenus(); (void)statusBar();//增加狀態(tài)欄 setWindowFilePath(QString()); resize(400, 300);//調(diào)整尺寸大小
構(gòu)造函數(shù)中的createActions()函數(shù)用于創(chuàng)建相應(yīng)的行為,創(chuàng)建了New、Open、Save、Save As、最近5個(gè)文件、Exit、About和About Qt這幾個(gè)Action,并設(shè)置相應(yīng)的快捷鍵、狀態(tài)欄和連接槽函數(shù):
//創(chuàng)建action void MainWindow::createActions() { newAct = new QAction(tr("&New"), this);//new newAct->setShortcuts(QKeySequence::New);//設(shè)置快捷鍵 newAct->setStatusTip(tr("Create a new file"));//設(shè)置狀態(tài)欄 connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); openAct = new QAction(tr("&Open..."), this);//open openAct->setShortcuts(QKeySequence::Open);//設(shè)置快捷鍵 openAct->setStatusTip(tr("Open an existing file"));//設(shè)置狀態(tài)欄 connect(openAct, SIGNAL(triggered()), this, SLOT(open())); saveAct = new QAction(tr("&Save"), this);//save saveAct->setShortcuts(QKeySequence::Save);//設(shè)置快捷鍵 saveAct->setStatusTip(tr("Save the document to disk"));//設(shè)置狀態(tài)欄 connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); saveAsAct = new QAction(tr("Save &As..."), this);//save as saveAsAct->setShortcuts(QKeySequence::SaveAs);//設(shè)置快捷鍵 saveAsAct->setStatusTip(tr("Save the document under a new name"));//設(shè)置狀態(tài)欄 connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); //5個(gè)Action(打開最近五個(gè)文件) 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);//設(shè)置快捷鍵 exitAct->setStatusTip(tr("Exit the application"));//設(shè)置狀態(tài)欄 connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); aboutAct = new QAction(tr("&About"), this);//about aboutAct->setStatusTip(tr("Show the application's About box"));//設(shè)置狀態(tài)欄 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"));//設(shè)置狀態(tài)欄 connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); }
newFile()槽函數(shù)用于新建一個(gè)相同的窗口:
//新建界面并顯示 void MainWindow::newFile() { MainWindow *other = new MainWindow; other->show(); }
open()槽函數(shù)用于打開并加載文檔:
//打開文件 void MainWindow::open() { QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) loadFile(fileName); }
loadFile()函數(shù):
//加載文件 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);//等待光標(biāo) textEdit->setPlainText(in.readAll());//設(shè)置文本 QGuiApplication::restoreOverrideCursor();//撤銷最后一個(gè)光標(biāo) setCurrentFile(fileName); statusBar()->showMessage(tr("File loaded"), 2000); }
setCurrentFile()函數(shù)用于設(shè)置當(dāng)前文件關(guān)聯(lián)路徑:
//設(shè)置當(dāng)前文件 void MainWindow::setCurrentFile(const QString &fileName) { curFile = fileName; setWindowFilePath(curFile);//設(shè)置關(guān)聯(lián)文件路徑 QSettings settings; QStringList files = settings.value("recentFileList").toStringList(); files.removeAll(fileName);//移除所有文件名 files.prepend(fileName);//在開頭附加子串 //如果尺寸超過最大尺寸,則刪除最后一項(xiàng) while (files.size() > MaxRecentFiles) files.removeLast(); settings.setValue("recentFileList", files);//設(shè)置鍵值對(duì) foreach (QWidget *widget, QApplication::topLevelWidgets()) { MainWindow *mainWin = qobject_cast<MainWindow *>(widget); if (mainWin) mainWin->updateRecentFileActions();//更新最近文件 } }
updateRecentFileActions()函數(shù)更新最近文件信息
void MainWindow::updateRecentFileActions() { QSettings settings; QStringList files = settings.value("recentFileList").toStringList();//讀取recentFileList的值 int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);//計(jì)算兩者的最小值 for (int i = 0; i < numRecentFiles; ++i) { QString text = tr("&%1 %2").arg(i + 1).arg(strippedName(files[i]));//序號(hào) 文件名 recentFileActs[i]->setText(text);//設(shè)置文本 recentFileActs[i]->setData(files[i]);//設(shè)置數(shù)據(jù) recentFileActs[i]->setVisible(true);//設(shè)置可見性 } for (int j = numRecentFiles; j < MaxRecentFiles; ++j) recentFileActs[j]->setVisible(false);//其他數(shù)量設(shè)置為不可見 separatorAct->setVisible(numRecentFiles > 0);//如果有最近未見則設(shè)置分隔符為可見 }
strippedName()函數(shù)用于獲取相應(yīng)的文件名:
//獲取文件名 QString MainWindow::strippedName(const QString &fullFileName) { return QFileInfo(fullFileName).fileName();//返回文件名 }
save()函數(shù)和saveAs()槽函數(shù)用于將文檔進(jìn)行保存:
//保存文件 void MainWindow::save() { if (curFile.isEmpty()) saveAs();//如果curFile為空,則設(shè)置保存為 else saveFile(curFile); } //保存為 void MainWindow::saveAs() { QString fileName = QFileDialog::getSaveFileName(this); if (fileName.isEmpty()) return; saveFile(fileName); }
saveFile()函數(shù):
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);//等待光標(biāo) out << textEdit->toPlainText();//將文本寫入 QGuiApplication::restoreOverrideCursor();//撤銷最后一個(gè)光標(biāo) setCurrentFile(fileName); statusBar()->showMessage(tr("File saved"), 2000);//狀態(tài)欄顯示2000ms }
openRecentFile()槽函數(shù)用于打開最近的文件:
//打開最近文件 void MainWindow::openRecentFile() { QAction *action = qobject_cast<QAction *>(sender()); if (action) loadFile(action->data().toString()); }
about()槽函數(shù)顯示相關(guān)信息:
//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.")); }
構(gòu)造函數(shù)中的createMenus()函數(shù)用于創(chuàng)建相應(yīng)的菜單欄:
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"); //設(shè)置組織名稱 a.setApplicationName("Recent Files"); //設(shè)置標(biāo)題名稱 MainWindow w; w.show(); return a.exec(); }
【注意】
在mainwindow.cpp中QSettings settings;語句用于構(gòu)造QSettings對(duì)象。
代碼:
QCoreApplication::setOrganizationName("Recently"); //設(shè)置組織名稱 QCoreApplication::setApplicationName("Recent Files"); //設(shè)置標(biāo)題名稱 QSettings settings;
等價(jià)于
QSettings settings("Recently", "Recent Files");
如果之前未調(diào)用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName(),則QSettings對(duì)象將無法讀取或?qū)懭肴魏卧O(shè)置,status()將返回AccessError。
五、效果演示
完整效果如下:
以上就是QT實(shí)戰(zhàn)之打開最近文檔功能的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于QT打開文檔的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入C++實(shí)現(xiàn)函數(shù)itoa()的分析
本篇文章是對(duì)C++實(shí)現(xiàn)函數(shù)itoa()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++編程中的const關(guān)鍵字常見用法總結(jié)
這篇文章主要介紹了C++編程中的const關(guān)鍵字常見用法總結(jié),const關(guān)鍵字的使用是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法
這篇文章主要介紹了詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C++編寫實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C++編寫實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C++?Cartographer的入口node main詳細(xì)講解
這篇文章主要介紹了C++Node類Cartographer的入口node main,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03C++實(shí)現(xiàn) vector 的四則運(yùn)算
本文給大家介紹的是在C++中實(shí)現(xiàn)高效的vector四則運(yùn)算的方法的相關(guān)資料,需要的朋友可以參考下2016-07-07