如下这个例子,其中
- openFile是打开文件的槽,它将打开的文件添加到最近的文件列表中;
- openRecentFile是从RecentFile菜单中打开最近使用的文件的插槽;
- createActions是初始化打开文件和最近文件的操作;
- createMenus是创建“文件”菜单,并添加打开文件和最近文件的操作;
- updateRecentFileActions是根据存储的最近文件更新最近的文件操作;
- addRecentFile是将一个文件添加到最近的文件列表并更新操作;
- moveFileToTop将文件移动到最近文件列表的顶部并更新操作;
- loadRecentFiles在应用程序启动期间加载和处理现有的最近文件。
#include <QMainWindow>
#include <QMenu>
#include <QAction>
#include <QFileDialog>
#include <QSettings>
#include <QFileInfo>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{
createActions();
createMenus();
// Load recent files from settings
loadRecentFiles();
}
private slots:
void openFile()
{
QString filePath = QFileDialog::getOpenFileName(this, tr("Open File"), QString(), tr("All Files (*)"));
if (!filePath.isEmpty()) {
// Process the opened file
// ...
// Add the file path to the recent files list
addRecentFile(filePath);
}
}
void openRecentFile()
{
QAction *action = qobject_cast<QAction *>(sender());
if (action) {
QString filePath = action->data().toString();
if (!filePath.isEmpty()) {
// Process the recently opened file
// ...
// Move the file to the top of the recent files list
moveFileToTop(filePath);
}
}
}
private:
void createActions()
{
openAction = new QAction(tr("Open..."), this);
connect(openAction, &QAction::triggered, this, &MainWindow::openFile);
for (int i = 0; i < MaxRecentFiles; ++i) {
recentFileActions[i] = new QAction(this);
recentFileActions[i]->setVisible(false);
connect(recentFileActions[i], &QAction::triggered, this, &MainWindow::openRecentFile);
}
}
void createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(openAction);
fileMenu->addSeparator();
recentFilesMenu = fileMenu->addMenu(tr("Recent &Files"));
updateRecentFileActions();
}
void updateRecentFileActions()
{
QStringList recentFiles = settings.value("recentFiles").toStringList();
int numRecentFiles = qMin(recentFiles.size(), MaxRecentFiles);
for (int i = 0; i < numRecentFiles; ++i) {
QString strippedName = QFileInfo(recentFiles[i]).fileName();
recentFileActions[i]->setText(strippedName);
recentFileActions[i]->setData(recentFiles[i]);
recentFileActions[i]->setVisible(true);
}
for (int j = numRecentFiles; j < MaxRecentFiles; ++j)
recentFileActions[j]->setVisible(false);
}
void addRecentFile(const QString &filePath)
{
QStringList recentFiles = settings.value("recentFiles").toStringList();
recentFiles.removeAll(filePath);
recentFiles.prepend(filePath);
while (recentFiles.size() > MaxRecentFiles)
recentFiles.removeLast();
settings.setValue("recentFiles", recentFiles);
updateRecentFileActions();
}
void moveFileToTop(const QString &filePath)
{
QStringList recentFiles = settings.value("recentFiles").toStringList();
recentFiles.removeAll(filePath);
recentFiles.prepend(filePath);
settings.setValue("recentFiles", recentFiles);
updateRecentFileActions();
}
void loadRecentFiles()
{
QStringList recentFiles = settings.value("recentFiles").toStringList();
for (const QString &filePath : recentFiles) {
QFileInfo fileInfo(filePath);
if (fileInfo.exists() && fileInfo.isFile()) {
// Process the existing recent file
// ...
}
}
updateRecentFileActions();
}
QMenu *fileMenu;
QMenu *recentFilesMenu;
QAction *openAction;
QAction *recentFileActions[MaxRecentFiles];
QSettings settings;
static const int MaxRecentFiles = 5;
};
具体情况还得根据你特定应用程序结构和需求调整代码,这个是我在学习过程中读取文件最常用的一套recentFiles程序。