QT开发中文网

class History { public: void push(QWidget* widget) { if (m_pList.size() >= MAX_HISTORY_SIZE) { m_pList.pop_front(); if (m_index > 0) { --m_index; } } // 存储界面和对应的QTreeView的选中状态 m_selections[widget] = findTreeViewSelection(widget);

修改后的代码如下:

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 m_pList; int m_index = -1; QMap m_selections; QMap m_stackedWidgets; // 保存QStackedWidget的指针 static const int MAX_HISTORY_SIZE = 20;

// 查找界面中的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(parentWidget())); } } };

// 在“前进”和“后退”按钮的槽函数中,从历史记录中获取对应的界面,并显示出来 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指针。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1288

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?