在运行时单击QTabWidget将内容加载到选项卡中

Load content into tab at runtime on click using QTabWidget

本文关键字:加载 选项 运行时 单击 QTabWidget      更新时间:2023-10-16

我在文件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,它们可能包含不同数量的选项卡。因此,每个窗口都有自己的QMainWindowQTabWidget,但parseCSV指针保持不变。

那么我怎么能像这样挂钩一个事件到每个选项卡,考虑到可能有多个窗口打开,需要在运行时加载内容,当一个选项卡被点击?

使用信号/插槽将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));
}