QT开发中文网

Qt 存储当前打开文件的历史页面,通过按下键盘的“前进”和“后退”按钮来实现界面的前进和返回、多次前进和多次返回功能,关闭程序后清空记录

Qt 提供了一个 QStackedWidget 类来实现多个页面之间的切换。可以将每个打开的文件对应的界面作为一个 widget 添加到 QStackedWidget 中,并使用 setCurrentIndex() 方法来切换页面。

为了实现历史记录功能,可以使用两个 QList 存储打开文件的顺序和对应的 widget。每次打开一个新文件时,将其添加至 QList 尾部,并将对应的 widget 添加至 QStackedWidget 末尾。当按下“前进”或“后退”按钮时,根据 QList 中保存的顺序切换页面即可。

多次前进和多次返回功能则需要在 QList 中记录当前所在位置的索引,以便能够正确地进行切换。

关闭程序时,需要清空 QList 和 QStackedWidget 中的所有记录。

具体实现细节可以参考以下代码:

// 在类的头文件中声明 QList<QWidget*> 和 QList<QString>,用于存储打开的文件和对应的界面
class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void openFile(); // 打开文件槽函数
    void goBack(); // 返回槽函数
    void goForward(); // 前进槽函数

private:
    Ui::MainWindow *ui;
    QString lastDir; // 上一次打开文件的目录
    QList<QWidget*> pages; // 存储打开的文件对应的 widget
    QList<QString> fileNames; // 存储打开的文件名
    int curIndex = -1; // 当前所在位置在 QList 中的索引,-1 表示未打开任何文件
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::openFile()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), lastDir);
    if (fileName.isEmpty()) {
        return;
    }

    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QMessageBox::warning(this, tr("Error"), tr("Failed to open file."));
        return;
    }

    QTextStream in(&file);
    QString content = in.readAll();

    QWidget *page = new QWidget(); // 创建新的 widget 作为一个页面
    QVBoxLayout *layout = new QVBoxLayout(page);
    QTextEdit *textEdit = new QTextEdit(page);
    textEdit->setPlainText(content);
    layout->addWidget(textEdit);

    pages.append(page); // 将打开的文件对应的 widget 添加至 QList 尾部
    fileNames.append(fileName); // 将打开的文件名添加至 QList 尾部
    curIndex = pages.size() - 1; // 更新当前所在位置的索引

    ui->stackedWidget->addWidget(page); // 将页面添加至 QStackedWidget 的末尾
    ui->stackedWidget->setCurrentWidget(page); // 切换到新页面
}

void MainWindow::goBack()
{
    if (curIndex <= 0) {
        return;
    }

    curIndex--;
    ui->stackedWidget->setCurrentWidget(pages[curIndex]); // 根据 QList 中保存的顺序切换页面
}

void MainWindow::goForward()
{
    if (curIndex >= pages.size() - 1) {
        return;
    }

    curIndex++;
    ui->stackedWidget->setCurrentWidget(pages[curIndex]); // 根据 QList 中保存的顺序切换页面
}

在 main.cpp 中创建 MainWindow 实例并运行程序:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

注意:关闭程序时需要清空 QList 和 QStackedWidget 中的所有记录。可以在 MainWindow 的析构函数中添加以下代码:

MainWindow::~MainWindow()
{
    qDeleteAll(pages); // 删除 QList 中保存的所有 widget
    pages.clear();
    fileNames.clear();
    delete ui;
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=792

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?