以下是完整的示例代码:
mywidget.h:
#ifndef MYWIDGET_H #define MYWIDGET_H
#include
const int MAX_HISTORY_SIZE = 10;
class MyWidget : public QWidget {
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
~MyWidget();
private slots:
void on_tableWidget_currentChanged(int index);
void goBack();
void goForward();
private:
Ui::MyWidget *ui;
QStack<int> *m_tableIndexStack;
};
#endif // MYWIDGET_H
mywidget.cpp:
#include “mywidget.h” #include “ui_mywidget.h”
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent), ui(new Ui::MyWidget)
{
ui->setupUi(this);
// 创建QStack
m_tableIndexStack = new QStack<int>();
// 创建"前进"和"后退"按钮
QPushButton *backButton = new QPushButton("后退", this);
QPushButton *forwardButton = new QPushButton("前进", this);
// 连接按钮的clicked信号到对应的槽函数
connect(backButton, &QPushButton::clicked, this, &MyWidget::goBack);
connect(forwardButton, &QPushButton::clicked, this, &MyWidget::goForward);
// 将按钮添加到布局中
QHBoxLayout *layout = new QHBoxLayout(this);
layout->addWidget(backButton);
layout->addWidget(forwardButton);
layout->addStretch(1); // 添加一个弹簧占位符,使按钮靠右对齐
layout->addWidget(ui->tableWidget); // 添加原来的ui_QTableWidget
}
MyWidget::~MyWidget() {
delete m_tableIndexStack;
delete ui;
}
void MyWidget::on_tableWidget_currentChanged(int index) {
m_tableIndexStack->push(index); // 将当前的table index压入QStack中
// 如果QStack超过了最大大小,就弹出栈底元素
if (m_tableIndexStack->size() > MAX_HISTORY_SIZE) {
m_tableIndexStack->removeLast();
}
}
void MyWidget::goBack() {
if (!m_tableIndexStack->isEmpty()) {
int currentIndex = ui->tableWidget->currentIndex(); // 当前的table index
int prevIndex = m_tableIndexStack->pop(); // 前一个table index
if (prevIndex != currentIndex) {
// 如果前一个table index不等于当前的table index,就切换到前一个表格
ui->tableWidget->setCurrentIndex(prevIndex);
} else {
// 否则继续取出前一个table index并尝试切换
goBack();
}
}
}
void MyWidget::goForward() {
if (!m_tableIndexStack->isEmpty()) {
int currentIndex = ui->tableWidget->currentIndex(); // 当前的table index
int nextIndex = m_tableIndexStack->pop(); // 下一个table index
if (nextIndex != currentIndex) {
// 如果下一个table index不等于当前的table index,就切换到下一个表格
ui->tableWidget->setCurrentIndex(nextIndex);
} else {
// 否则继续取出下一个table index并尝试切换
goForward();
}
}
}