<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文介紹利用Qt實現開啟最近檔案功能,並實現基本的新建、開啟、儲存、退出、幫助等功能。
新建一個Qt案例,專案名稱為“RecentTest”,基礎類別選擇“QMainWindow”,取消選中建立UI介面核取方塊,完成專案建立。
無UI介面
標頭檔案中需要宣告若干槽函數和相應函數:
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];
需要在建構函式中新增如下程式碼:
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); }
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開啟檔案的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45