QT 从布局中检索自定义小部件

QT retrieve custom widget from layout

我有一个滚动区域,其布局中添加了 8 个相同的自定义小部件。这个自定义小部件有一个 getter 函数,它将 return 一个值。我的问题是如何取回原始自定义小部件,以便我可以调用 getter 函数来检索它存储的数据?

我已经通过这种方式将自定义小部件添加到布局中:

for (int var = 0; var < 9; ++var) {
    calcRow *CalcWidget = new calcRow(this, &js, KeyList, SizeList);
    connect(CalcWidget, &calcRow::testSignal, this, &MainWindow::getRowData);

    ui->scrollArea_layout->layout()->addWidget(CalcWidget);
}

我卡在哪里:

void MainWindow::getRowData()
{
    for (int i = 0;i < ui->scrollArea_layout->layout()->count() ;++i ) {
        QWidget *row = ui->scrollArea_layout->layout()->itemAt(i)->widget();

        if(row != NULL)
        {
            std::cout << row->"SOMETHING TO GET CALCROW WIDGET"  <<std::endl;
        }
    }
}

通常这不是您代码的最佳结构,任何布局更改都可能会破坏您的实现。例如,如果您有多个 calcRow 小部件,则此解决方案将不起作用。

为了让它变得更好,您可以传递您想要在 getRowData 中使用的必需参数作为 testSignal 信号的参数。

或者使用 lambda 进一步简化它:

for (int var = 0; var < 9; ++var) {
    calcRow* CalcWidget = new calcRow(this, &js, KeyList, SizeList);
    connect(CalcWidget, &calcRow::testSignal, [CalcWidget]() 
        {
        std::cout << CalcWidget->"SOMETHING TO GET CALCROW WIDGET" << std::endl;
        });

    ui->scrollArea_layout->layout()->addWidget(CalcWidget);
}

对于将来会发现它的任何其他人,这些评论帮助了很多,我最终使用了 static_cast。我的最终代码如下所示:

void MainWindow::getRowData()
{
    for (int i = 0;i < ui->scrollArea_layout->layout()->count() ;++i ) {
        QWidget *row = ui->scrollArea_layout->layout()->itemAt(i)->widget();

        calcRow *rowConverted = static_cast<calcRow*>(row);

        if(row != NULL)
        {
            std::cout << rowConverted ->getData()  <<std::endl;
        }
    }
}