QT實(shí)戰(zhàn)之打開最近文檔功能的實(shí)現(xiàn)
一、項(xiàng)目介紹
本文介紹利用Qt實(shí)現(xiàn)打開最近文檔功能,并實(shí)現(xiàn)基本的新建、打開、保存、退出、幫助等功能。
二、項(xiàng)目基本配置
新建一個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個
enum { MaxRecentFiles = 5 };
QAction *recentFileActs[MaxRecentFiles];4.2 mainwindow.cpp源文件
需要在構(gòu)造函數(shù)中添加如下代碼:
setAttribute(Qt::WA_DeleteOnClose);//當(dāng)關(guān)閉時刪除該組件
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個文件、Exit、About和About Qt這幾個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個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);//設(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ù)用于新建一個相同的窗口:
//新建界面并顯示
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();//撤銷最后一個光標(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è)置鍵值對
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]));//序號 文件名
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();//撤銷最后一個光標(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對象。
代碼:
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對象將無法讀取或?qū)懭肴魏卧O(shè)置,status()將返回AccessError。
五、效果演示
完整效果如下:

以上就是QT實(shí)戰(zhàn)之打開最近文檔功能的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于QT打開文檔的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解C語言中free()函數(shù)與getpagesize()函數(shù)的使用
這篇文章主要介紹了詳解C語言中free()函數(shù)與getpagesize()函數(shù)的使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
C++通過自定義函數(shù)找出一個整數(shù)數(shù)組中第二大數(shù)的方法
這篇文章主要介紹了C++通過自定義函數(shù)找出一個整數(shù)數(shù)組中第二大數(shù)的方法,涉及C++針對數(shù)組的遍歷操作相關(guān)技巧,需要的朋友可以參考下2015-06-06
用Visual Studio2017寫C++靜態(tài)庫圖文詳解
這篇文章主要介紹了用Visual Studio2017寫C++靜態(tài)庫的圖文教程,需要的朋友可以參考下2017-04-04
使用C++進(jìn)行Cocos2d-x游戲開發(fā)入門過程中的要點(diǎn)解析
這篇文章主要介紹了使用C++進(jìn)行Cocos2d-x游戲開發(fā)入門過程中的要點(diǎn)解析,主要針對畫面變化以及觸摸響應(yīng)方面,需要的朋友可以參考下2015-12-12

