You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT如何从layout中取回自定义calcRow控件并调用其getter函数取值

解决方案

你需要使用Qt提供的qobject_cast对QWidget实例做类型转换,转换成功后即可得到calcRow控件实例,直接调用其getter函数即可。

前置要求

你的calcRow自定义控件类的声明中必须添加Q_OBJECT宏,这是Qt类型安全转换的必要前提:

class calcRow : public QWidget
{
    Q_OBJECT // 必须有这个宏,否则转换会失败
    // 其余类定义...
};

方案1:遍历所有布局内控件获取实例

修改你的getRowData函数如下即可:

void MainWindow::getRowData()
{
    for (int i = 0;i < ui->scrollArea_layout->layout()->count() ;++i ) {
        QWidget *row = ui->scrollArea_layout->layout()->itemAt(i)->widget();
        // 类型转换为calcRow指针
        calcRow *calcRowWidget = qobject_cast<calcRow*>(row);
        if(calcRowWidget != nullptr)
        {
            // 转换成功,直接调用你自定义的getter函数即可,示例假设getter名为getStoredValue
            std::cout << calcRowWidget->getStoredValue() << std::endl;
        }
    }
}

如果你的编译环境开启了RTTI支持,也可以用C++标准的dynamic_cast替换qobject_cast,但Qt原生的qobject_cast不需要RTTI支持,跨平台兼容性更好,更推荐使用。

方案2:直接获取触发信号的calcRow实例(更高效)

你的calcRow实例触发testSignal信号才会调用getRowData槽函数,不需要遍历所有控件,直接用Qt的sender()方法即可拿到当前触发信号的calcRow实例:

void MainWindow::getRowData()
{
    calcRow *triggerRow = qobject_cast<calcRow*>(sender());
    if(triggerRow != nullptr)
    {
        // 直接调用getter读取当前触发信号的控件数据
        std::cout << triggerRow->getStoredValue() << std::endl;
    }
}

内容的提问来源于stack exchange,提问作者laxer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 17:33:04