如下这个例子,其中

  • 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程序。