代码如下:
#include <QtWidgets>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
private slots:
void addPage();
void forward();
void backward();
private:
QTableWidget *table;
QStack<QTableWidget*> pageStack;
QPushButton *forwardButton;
QPushButton *backwardButton;
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
table = new QTableWidget(10, 2, this);
setCentralWidget(table);
forwardButton = new QPushButton("Forward", this);
forwardButton->setEnabled(false);
connect(forwardButton, &QPushButton::clicked, this, &MainWindow::forward);
backwardButton = new QPushButton("Backward", this);
backwardButton->setEnabled(false);
connect(backwardButton, &QPushButton::clicked, this, &MainWindow::backward);
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addWidget(backwardButton);
buttonLayout->addWidget(forwardButton);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(buttonLayout);
mainLayout->addWidget(table);
QWidget *mainWidget = new QWidget(this);
mainWidget->setLayout(mainLayout);
setCentralWidget(mainWidget);
addPage();
}
void MainWindow::addPage()
{
if (pageStack.size() >= 20) {
delete pageStack.pop();
}
QTableWidget *newTable = new QTableWidget(10, 2, this);
for (int i = 0; i < 10; ++i) {
newTable->setItem(i, 0, new QTableWidgetItem(QString("Row %1").arg(i)));
newTable->setItem(i, 1, new QTableWidgetItem(QString("Page %1").arg(pageStack.size() + 1)));
}
pageStack.push(newTable);
forwardButton->setEnabled(false);
backwardButton->setEnabled(true);
}
void MainWindow::forward()
{
if (pageStack.size() > 1) {
QTableWidget *prevTable = pageStack.pop();
QTableWidget *curTable = pageStack.top();
table->setVisible(false);
setCentralWidget(curTable);
table->setVisible(true);
delete prevTable;
forwardButton->setEnabled(pageStack.size() > 1);
backwardButton->setEnabled(true);
}
}
void MainWindow::backward()
{
if (pageStack.size() > 1) {
QTableWidget *curTable = pageStack.pop();
QTableWidget *prevTable = pageStack.top();
table->setVisible(false);
setCentralWidget(prevTable);
table->setVisible(true);
delete curTable;
forwardButton->setEnabled(true);
backwardButton->setEnabled(pageStack.size() > 1);
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#include "main.moc"
实现思路如下:
使用一个QStack来存储每一页的QTableWidget,将最新的页面放在栈顶。
每次添加新页时,若QStack已经存储了20页,则删除最旧的一页,然后新建一页QTableWidget并压入栈顶。
用户按下“前进”按钮时,若栈中有两个以上的元素,则弹出栈顶元素(当前页),获取上一个元素作为新的中央窗口,并删除当前页。
用户按下“后退”按钮时,若栈中有两个以上的元素,则弹出栈顶元素(当前页),获取上一个元素作为新的中央窗口,并删除当前页。
在添加新页和切换页时,需要将之前的QTableWidget隐藏,否则会出现多个重叠的QTableWidget。