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;
}