QT實(shí)戰(zhàn)之打開(kāi)最近文檔功能的實(shí)現(xiàn)
一、項(xiàng)目介紹
本文介紹利用Qt實(shí)現(xiàn)打開(kāi)最近文檔功能,并實(shí)現(xiàn)基本的新建、打開(kāi)、保存、退出、幫助等功能。
二、項(xiàng)目基本配置
新建一個(gè)Qt案例,項(xiàng)目名稱(chēng)為“RecentTest”,基類(lèi)選擇“QMainWindow”,取消選中創(chuàng)建UI界面復(fù)選框,完成項(xiàng)目創(chuàng)建。
三、UI界面設(shè)置
無(wú)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(打開(kāi)最近五個(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ù)用于打開(kāi)并加載文檔:
//打開(kāi)文件
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();//撤銷(xiāo)最后一個(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);//在開(kāi)頭附加子串
//如果尺寸超過(guò)最大尺寸,則刪除最后一項(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è)置可見(jiàn)性
}
for (int j = numRecentFiles; j < MaxRecentFiles; ++j)
recentFileActs[j]->setVisible(false);//其他數(shù)量設(shè)置為不可見(jiàn)
separatorAct->setVisible(numRecentFiles > 0);//如果有最近未見(jiàn)則設(shè)置分隔符為可見(jiàn)
}
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();//將文本寫(xiě)入
QGuiApplication::restoreOverrideCursor();//撤銷(xiāo)最后一個(gè)光標(biāo)
setCurrentFile(fileName);
statusBar()->showMessage(tr("File saved"), 2000);//狀態(tài)欄顯示2000ms
}
openRecentFile()槽函數(shù)用于打開(kāi)最近的文件:
//打開(kāi)最近文件
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è)置組織名稱(chēng)
a.setApplicationName("Recent Files"); //設(shè)置標(biāo)題名稱(chēng)
MainWindow w;
w.show();
return a.exec();
}
【注意】
在mainwindow.cpp中QSettings settings;語(yǔ)句用于構(gòu)造QSettings對(duì)象。
代碼:
QCoreApplication::setOrganizationName("Recently"); //設(shè)置組織名稱(chēng)
QCoreApplication::setApplicationName("Recent Files"); //設(shè)置標(biāo)題名稱(chēng)
QSettings settings;
等價(jià)于
QSettings settings("Recently", "Recent Files");
如果之前未調(diào)用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName(),則QSettings對(duì)象將無(wú)法讀取或?qū)懭肴魏卧O(shè)置,status()將返回AccessError。
五、效果演示
完整效果如下:

以上就是QT實(shí)戰(zhàn)之打開(kāi)最近文檔功能的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于QT打開(kāi)文檔的資料請(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-05
C++編程中的const關(guān)鍵字常見(jiàn)用法總結(jié)
這篇文章主要介紹了C++編程中的const關(guān)鍵字常見(jiàn)用法總結(jié),const關(guān)鍵字的使用是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11
C語(yǔ)言模擬實(shí)現(xiàn)庫(kù)函數(shù)詳解
C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來(lái)詳細(xì)了解它2022-07-07
詳解C語(yǔ)言中的rename()函數(shù)和remove()函數(shù)的使用方法
這篇文章主要介紹了詳解C語(yǔ)言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
C++編寫(xiě)實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C++編寫(xiě)實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C++?Cartographer的入口node main詳細(xì)講解
這篇文章主要介紹了C++Node類(lèi)Cartographer的入口node main,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-03-03
C++實(shí)現(xiàn) vector 的四則運(yùn)算
本文給大家介紹的是在C++中實(shí)現(xiàn)高效的vector四則運(yùn)算的方法的相關(guān)資料,需要的朋友可以參考下2016-07-07

