修改后的代码如下:
class History { public: void push(QWidget* widget, QStackedWidget* stackedWidget) { if (m_pList.size() >= MAX_HISTORY_SIZE) { m_pList.pop_front(); if (m_index > 0) { –m_index; } }
// 存储界面和对应的QTreeView的选中状态
m_selections[widget] = findTreeViewSelection(widget);
m_pList.insert(m_pList.begin() + m_index + 1, widget);
++m_index;
// 保存QStackedWidget的指针
m_stackedWidgets[widget] = stackedWidget;
}
QWidget* current() const {
return m_pList.at(m_index);
}
bool canGoBack() const {
return m_index > 0;
}
bool canGoForward() const {
return m_index < m_pList.size() - 1;
}
void goBack(QWidget* widget) {
if (canGoBack()) {
// 存储当前界面的选中状态
QWidget* currentWidget = current();
m_selections[currentWidget] = findTreeViewSelection(currentWidget);
--m_index;
// 恢复上一个界面的选中状态并显示出来
QWidget* prevWidget = current();
QTreeView* treeView = findTreeView(prevWidget);
if (treeView && m_selections.contains(prevWidget)) {
treeView->selectionModel()->select(m_selections[prevWidget], QItemSelectionModel::Select);
}
// 使用传递过来的QStackedWidget指针
m_stackedWidgets[widget]->setCurrentWidget(prevWidget);
}
}
void goForward(QWidget* widget) {
if (canGoForward()) {
// 存储当前界面的选中状态
QWidget* currentWidget = current();
m_selections[currentWidget] = findTreeViewSelection(currentWidget);
++m_index;
// 恢复下一个界面的选中状态并显示出来
QWidget* nextWidget = current();
QTreeView* treeView = findTreeView(nextWidget);
if (treeView && m_selections.contains(nextWidget)) {
treeView->selectionModel()->select(m_selections[nextWidget], QItemSelectionModel::Select);
}
// 使用传递过来的QStackedWidget指针
m_stackedWidgets[widget]->setCurrentWidget(nextWidget);
}
}
void clear() {
m_pList.clear();
m_index = -1;
m_selections.clear();
m_stackedWidgets.clear(); // 清空保存的QStackedWidget指针
}
private:
QList
// 查找界面中的QTreeView QTreeView* findTreeView(QWidget* widget) {
return widget->findChild<QTreeView*>();
}
// 获取QTreeView的选中状态 QItemSelection findTreeViewSelection(QWidget* widget) {
QTreeView* treeView = findTreeView(widget);
if (treeView) {
return treeView->selectionModel()->selection();
}
return QItemSelection();
} };
// 将History类变为单例模式 class HistoryManager { public: static History& instance() { static History history; return history; } };
// 在每个界面的构造函数中,将自身加入历史记录
class MyWidget : public QWidget {
public:
MyWidget(QWidget* parent = nullptr) : QWidget(parent) {
if (!HistoryManager::instance().canGoForward()) {
HistoryManager::instance().push(this, qobject_cast
// 在“前进”和“后退”按钮的槽函数中,从历史记录中获取对应的界面,并显示出来 class MainWindow : public QMainWindow { public: MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) { // … connect(m_backButton, &QPushButton::clicked, this, this{
// 使用当前Widget及其父类中已保存的QStackedWidget指针
HistoryManager::instance().goBack(this);
m_stackedWidget->setCurrentWidget(HistoryManager::instance().current());
}); connect(m_forwardButton, &QPushButton::clicked, this, this{
// 使用当前Widget及其父类中已保存的QStackedWidget指针
HistoryManager::instance().goForward(this);
m_stackedWidget->setCurrentWidget(HistoryManager::instance().current());
}); // … }
// … };
需要注意的是,在MyWidget中将自身加入历史记录时,需要同时传递父类中的QStackedWidget指针;在MainWindow中的槽函数中,也需要使用当前Widget及其父类中已保存的QStackedWidget指针。