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
相关产品推荐
相关产品推荐

