QTabWidget 上有没有一种方法或方法可以检查用户是否访问过某个标签页?
Is there a method or a way to check whether a user has visited a certain tab page on a QTabWidget?
我的应用程序上有一个 QTabWidget,因此用户可以通过单击标题来浏览标签页,我想知道当用户打开标签页时,he/she 之前是否访问过该页面。在 QWizard class 中有一个方法 hasVisitedPage() 做完全相同的事情在向导上,但我在 QTabWidget class 中找不到类似的方法。我想知道的是,有没有类似QWizard的方法?
这是QWizard中的类似方法class http://doc.qt.io/archives/qt-4.8/qwizard.html#hasVisitedPage
目前我正在使用QList来存储访问过的页面索引,每次用户打开标签页时检查QList是否包含打开页面的索引,我认为如果这样会更容易我有一个方法来检查
What I want to know is, whether there is a method to do this like in QWizard?
很遗憾,没有。
Currently I am using a QList to store the visited page indexes and each time when a user open a tabpage check whether QList contains the index of the opened page
QWizard 做同样的事情,即有一个 QList<int> history;
属性。所以,在我看来,你的做法是正确的。
看看 source code for more details. In particular, QWizardPrivate::switchToPage 您可能会感兴趣,以便让您了解 QWizard 是如何完成的,这样您就可以检查您的自己的实施并在必要时进行调整。
history
属性 很容易添加:
// https://github.com/KubaO/Whosebugn/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();
}
我的应用程序上有一个 QTabWidget,因此用户可以通过单击标题来浏览标签页,我想知道当用户打开标签页时,he/she 之前是否访问过该页面。在 QWizard class 中有一个方法 hasVisitedPage() 做完全相同的事情在向导上,但我在 QTabWidget class 中找不到类似的方法。我想知道的是,有没有类似QWizard的方法?
这是QWizard中的类似方法class http://doc.qt.io/archives/qt-4.8/qwizard.html#hasVisitedPage
目前我正在使用QList来存储访问过的页面索引,每次用户打开标签页时检查QList是否包含打开页面的索引,我认为如果这样会更容易我有一个方法来检查
What I want to know is, whether there is a method to do this like in QWizard?
很遗憾,没有。
Currently I am using a QList to store the visited page indexes and each time when a user open a tabpage check whether QList contains the index of the opened page
QWizard 做同样的事情,即有一个 QList<int> history;
属性。所以,在我看来,你的做法是正确的。
看看 source code for more details. In particular, QWizardPrivate::switchToPage 您可能会感兴趣,以便让您了解 QWizard 是如何完成的,这样您就可以检查您的自己的实施并在必要时进行调整。
history
属性 很容易添加:
// https://github.com/KubaO/Whosebugn/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();
}