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

问题描述

我有一个滚动区域的布局,其中添加了 8 个相同的自定义小部件。这个自定义小部件有一个 getter 函数,它将返回一个值。我的问题是如何取回原始的自定义小部件,以便我可以调用 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;
        }
    }
}