【问题标题】:How Can I get the Current Text of a QComboBox in QGridLayout?如何在 QGridLayout 中获取 QComboBox 的当前文本?
【发布时间】:2020-02-06 15:09:29
【问题描述】:

目前我有一个在按下按钮时调用的创建插槽。 Slot 函数需要从它上面的 QGridLayout 中的 ComboBoxes 中获取所有数据。在上面的项目中,并非所有项目都有 QComboBoxes。其中一些是 QLineEdit,另一些是 QLabel。我的 QgridLayout 叫做 ui.testgridLayout。

for (int i = 0; i < ui.testgridLayout->rowCount(); i++)
{
    for (int j = 0; j < ui.testgridLayout->columnCount(); j++)
    {
        QLayoutItem *item= ui.testgridLayout->itemAtPosition(i, j);
        if (item) {
            if (strcmp(item->widget()->metaObject()->className(), "QComboBox")==0) {
                QString objName= item->widget()->objectName();
                QComboBox* cb =ui.testgridLayout->findChild<QComboBox*>(objName);
                string text = cb->currentText().toLocal8Bit().constData();
            }
        }
     }
  }

目前这在 ConfigFileCreation.exe 中的 0x00007FFB107DCC8A (Qt5Widgets.dll) 处返回未处理的异常:0xC0000005:访问冲突读取位置 0x0000000000000008。任何帮助或建议将不胜感激。

【问题讨论】:

    标签: c++ qt qcombobox qgridlayout


    【解决方案1】:

    问题是您认为放置在布局中的小部件是布局的子级,但不,这些小部件是建立布局的小部件的子级,因此在您的代码中“cb”是一个空指针,导致问题。解决方案是强制转换并验证指针是否有效:

    for (int i = 0; i < ui.testgridLayout->rowCount(); i++){
        for (int j = 0; j < ui.testgridLayout->columnCount(); j++){
            if (QLayoutItem *item= ui.testgridLayout->itemAtPosition(i, j)) {
                if (QComboBox* cb  = qobject_cast<QComboBox*>(item->widget())) {
                    string text = cb->currentText().toLocal8Bit().constData();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 2015-05-27
      • 1970-01-01
      • 2020-10-17
      • 2011-05-27
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多