Есть ли способ или способ проверить, посетил ли пользователь определенную вкладку в QTabWidget? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть приложение QTabWidget, поэтому пользователь может перемещаться по страницам вкладок, нажимая на заголовок. Я хочу знать, когда пользователь открывает страницу вкладок, посещал ли он эту страницу ранее.В QWizard классе есть метод hasVisitedPage () , который делает то же самое с мастером, но я не смог найти аналогичный метод в классе QTabWidget,То, что я хочу знать, есть ли способ сделать это, как в QWizard?

это аналогичный метод в классе QWizard http://doc.qt.io/archives/qt-4.8/qwizard.html#hasVisitedPage

В настоящее время я используюQList для хранения индексов посещенных страниц и каждый раз, когда пользователь открывает вкладку, проверяет, содержит ли QList индекс открытой страницы, я думаю, было бы проще, если бы у меня был метод проверки

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Свойство 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();
}
0 голосов
/ 27 августа 2018

Что я хочу знать, есть ли способ сделать это, как в QWizard?

К сожалению, нет.

В настоящее времяЯ использую QList для хранения индексов посещенных страниц и каждый раз, когда пользователь открывает вкладку, проверяет, содержит ли QList индекс открытой страницы

QWizard делает то же самое,т.е. имеет атрибут QList<int> history;.Так что, на мой взгляд вы делаете это правильно .

Посмотрите на исходный код для получения более подробной информации.В частности, QWizardPrivate :: switchToPage может быть интересным для вас, чтобы дать вам представление о том, как это делается в QWizard , так что вы можете проверить свою собственную реализацию и адаптироватьэто при необходимости.

...