有没有方法或方法来检查用户是否访问了QTabWidget上的特定标签页?

时间:2018-08-27 05:36:16

标签: c++ qt qtabwidget

我的应用程序上有一个QTabWidget,因此用户可以通过单击标题来浏览选项卡页面,我想知道用户何时打开选项卡页面,是否他/她以前曾访问过该页面。在 QWizard 类中,有一种方法 hasVisitedPage() 可以在向导中执行完全相同的操作,但是我找不到类似的方法在QTabWidget类中。我想知道的是,是否有像QWizard那样的方法?

这与QWizard类http://doc.qt.io/archives/qt-4.8/qwizard.html#hasVisitedPage中的类似方法

当前,我正在使用QList来存储访问的页面索引,并且每当用户打开标签页时,检查QList是否包含已打开页面的索引,我想如果有一种方法会更容易检查

2 个答案:

答案 0 :(得分:1)

  

我想知道的是,是否有一种方法可以像QWizard中那样?

不幸的是,没有。

  

当前,我正在使用QList来存储访问的页面索引,每次用户打开标签页时,都要检查QList是否包含已打开页面的索引

QWizard 相同,即具有QList<int> history;属性。因此,我认为您的做法正确

查看source code了解更多详细信息。为了使您了解如何在 QWizard 中完成操作,QWizardPrivate::switchToPage可能对您特别有趣,因此您可以检查自己的实现并在必要时进行调整。

答案 1 :(得分:1)

history属性很容易添加:

screenshot of the example code

// https://github.com/KubaO/stackoverflown/tree/master/questions/tabwidget-history-52033092
#include <QtWidgets>
#include <array>

static const char kHistory[] = "history";

auto getHistory(const QTabWidget *w) {
   return w->property(kHistory).value<QList<int>>();
}

void addHistory(QTabWidget *tabWidget) {
   QObject::connect(tabWidget, &QTabWidget::currentChanged, [tabWidget](int index) {
      if (index < 0) return;
      auto history = getHistory(tabWidget);
      history.removeAll(index);
      history.append(index);
      tabWidget->setProperty(kHistory, QVariant::fromValue(history));
   });
   if (tabWidget->currentIndex() >= 0)
      tabWidget->setProperty(
          kHistory, QVariant::fromValue(QList<int>() << tabWidget->currentIndex()));
}

bool hasVisitedPage(const QTabWidget *w, int index) {
   return getHistory(w).contains(index);
}

int main(int argc, char *argv[]) {
   QApplication app(argc, argv);
   QWidget ui;
   QVBoxLayout layout{&ui};
   QTabWidget tabWidget;
   QLabel history;
   layout.addWidget(&tabWidget);
   layout.addWidget(&history);
   std::array<QLabel, 5> tabs;
   for (auto &l : tabs) {
      auto const n = &l - &tabs[0] + 1;
      l.setText(QStringLiteral("Label on Page #%1").arg(n));
      tabWidget.addTab(&l, QStringLiteral("Page #%1").arg(n));
   }
   addHistory(&tabWidget);
   auto showHistory = [&] {
      auto text = QStringLiteral("History: ");
      for (auto i : tabWidget.property("history").value<QList<int>>())
         text.append(QString::number(i + 1));
      history.setText(text);
   };
   showHistory();
   QObject::connect(&tabWidget, &QTabWidget::currentChanged, showHistory);
   tabWidget.currentChanged(tabWidget.currentIndex());
   ui.show();
   return app.exec();
}