实现的基本思路如下:
在QWidget类中定义一个QStack
类型的变量,用于存储历史打开的QTableWidget界面。 在打开新的QTableWidget界面时,将该界面添加到QStack中,并判断QStack的大小是否超过20页,如果超过,则弹出栈底元素。
实现“前进”和“后退”按钮的槽函数,分别从QStack中取出上一页或下一页的QTableWidget,然后在界面中显示。
在文件关闭时清空QStack中的所有元素。
具体代码实现如下:
class MyWidget : public QWidget {
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
// 创建工具栏和按钮
m_toolbar = new QToolBar(this);
m_backBtn = new QAction(QIcon(":/icons/back.png"), tr("Back"), this);
m_forwardBtn = new QAction(QIcon(":/icons/forward.png"), tr("Forward"), this);
// 连接按钮的信号槽
connect(m_backBtn, &QAction::triggered, this, &MyWidget::onBackClicked);
connect(m_forwardBtn, &QAction::triggered, this, &MyWidget::onForwardClicked);
// 将按钮添加到工具栏中
m_toolbar->addAction(m_backBtn);
m_toolbar->addAction(m_forwardBtn);
// 设置布局
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(m_toolbar);
layout->addWidget(m_tableWidget);
// 初始化QStack
m_stack.reserve(20);
}
protected:
void closeEvent(QCloseEvent *event) override {
// 清空QStack中的所有元素
while (!m_stack.isEmpty()) {
delete m_stack.pop();
}
event->accept();
}
private slots:
void onBackClicked() {
if (!m_stack.isEmpty() && m_currentIndex > 0) {
m_currentIndex--;
m_tableWidget = m_stack[m_currentIndex];
m_tableWidget->show();
}
}
void onForwardClicked() {
if (!m_stack.isEmpty() && m_currentIndex < m_stack.size() - 1) {
m_currentIndex++;
m_tableWidget = m_stack[m_currentIndex];
m_tableWidget->show();
}
}
private:
QToolBar *m_toolbar;
QAction *m_backBtn;
QAction *m_forwardBtn;
QTableWidget *m_tableWidget;
QStack<QTableWidget*> m_stack;
int m_currentIndex = -1;
void openTableWidget() {
// 创建QTableWidget界面
QTableWidget *tableWidget = new QTableWidget(this);
// 将新界面添加到QStack中
m_stack.push(tableWidget);
// 判断QStack的大小是否超过20页,如果超过,则弹出栈底元素
if (m_stack.size() > 20) {
delete m_stack.takeFirst();
}
// 显示新界面
m_currentIndex = m_stack.size() - 1;
m_tableWidget = m_stack[m_currentIndex];
m_tableWidget->show();
}
};