在运行时使用 QTabWidget 将内容加载到选项卡中
Posted
技术标签:
【中文标题】在运行时使用 QTabWidget 将内容加载到选项卡中【英文标题】:Load content into tab at runtime on click using QTabWidget 【发布时间】:2015-05-25 12:56:04 【问题描述】:所以我在文件AnalysisDisplays.cpp
中有这段代码
void AnalysisDisplays::showAnalysisDisplays(QWidget *parent)
QMainWindow *mw = new QMainWindow(parent);
mw->setWindowTitle("Equity Strategy Analysis");
mw->setMinimumSize(750, 700);
QTabWidget *tabw = new QTabWidget(mw);
mw->setCentralWidget(tabw);
for (QListWidgetItem *wi: listItems)
if (wi->checkState())
std::string eqType = wi->text().toStdString();
DisplayAnalysis *dw = new DisplayAnalysis();
displays[currentDisplayId] = dw;
//Add this tab to tab widget
tabw->addTab(dw, eqType.c_str());
dw->setDisplayId(currentDisplayId);
currentDisplayId++;
//dw->displayAnalysis(parseCSV->getDataForEquityType(eqType));
//Show the main window
mw->show();
问题是我们可能会创建许多超级慢的选项卡。注释掉的行是我想在运行时运行的。问题是我目前正在制作 QMainWindow 和 QTabWidget 而忘记了它。我需要以某种方式将一个事件挂钩到 QTabWidget,因此每当单击选项卡对象 (DisplayAnalysis) dw
时,它将调用 dw->displayAnalysis(parseCSV->getDataForEquityType(eqType));
其中 eqType 是选项卡的标题。这将导致选项卡内容被填充。
可以打开多个调用showAnalysisDisplays
的窗口,它们可能包含不同数量的选项卡。所以每个窗口都有自己的QMainWindow
和QTabWidget
但parseCSV
指针保持不变。
那么我怎样才能像这样将事件挂接到每个选项卡,考虑到可能有多个打开的窗口需要在运行时在单击选项卡时加载内容?
【问题讨论】:
慢的部分是哪一部分?parseCSV->getDataForEquityType(eqType)
还是 dw->displayAnalysis(..)
?您真的需要在每次单击选项卡时调用它,还是只在第一次单击时调用它?
【参考方案1】:
使用信号/插槽将QTabWidget::currentChanged
连接到自定义插槽,然后使用QTabWidget::tabText
获取选项卡和选项卡标题,例如:
void AnalysisDisplays::currentChangedSlot(int index)
std::string eqType = tabw->tabText(index).toStdString();
DisplayAnalysis *dw = qobject_cast<DisplayAnalysis*>(tabw->widget(index)));
dw->displayAnalysis(parseCSV->getDataForEquityType(eqType));
【讨论】:
这很好用(实际上我最终创建了自己的选项卡类,类似于这里所做的:codeprogress.com/cpp/libraries/qt/…)。您的解决方案中还有一个小错误,在您的情况下,您有一个变量名qobject_cast<DisplayAnalysis *dw>
应该是 qobject_cast<DisplayAnalysis *>
。以上是关于在运行时使用 QTabWidget 将内容加载到选项卡中的主要内容,如果未能解决你的问题,请参考以下文章