網(wǎng)站首頁 編程語言 正文
一、項目介紹
本文介紹利用Qt實現(xiàn)打開最近文檔功能,并實現(xiàn)基本的新建、打開、保存、退出、幫助等功能。
二、項目基本配置
新建一個Qt案例,項目名稱為“RecentTest”,基類選擇“QMainWindow”,取消選中創(chuàng)建UI界面復(fù)選框,完成項目創(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);//在開頭附加子串
//如果尺寸超過最大尺寸,則刪除最后一項
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);//計算兩者的最小值
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;
等價于
QSettings settings("Recently", "Recent Files");
如果之前未調(diào)用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName(),則QSettings對象將無法讀取或?qū)懭肴魏卧O(shè)置,status()將返回AccessError。
五、效果演示
完整效果如下:
原文鏈接:https://wendy.blog.csdn.net/article/details/125253934
相關(guān)推薦
- 2022-05-12 ubuntu 20.04 redis fatal error: stdlib.h: No such
- 2023-03-21 Android?Hilt依賴注入的實現(xiàn)淺析_Android
- 2024-02-25 Navicat提示Access violation at address **** in modul
- 2022-06-23 C++11系列學(xué)習(xí)之類型推導(dǎo)_C 語言
- 2022-02-12 Property 'fromEvent' does not exist on type 'typeo
- 2022-12-25 深入了解Go語言中g(shù)oioc框架的使用_Golang
- 2022-08-03 GoFrame?ORM原生方法操作示例_Golang
- 2022-04-22 element的el-drawer預(yù)留操作欄問題
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支