Как я могу получить текущий текст QComboBox в QGridLayout? - PullRequest
1 голос
/ 06 февраля 2020

На данный момент у меня есть слот создания, который вызывается при нажатии кнопки. Функция Slot должна получить все данные из ComboBox в QGridLayout над ним. В пунктах выше не все они имеют 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();
            }
        }
     }
  }

В настоящий момент это возвращает необработанное исключение в 0x00007FFB107DCC8A (Qt5Widgets.dll) в ConfigFileCreation.exe: 0xC0000005: расположение чтения нарушения доступа 0x0000000000000008. Любая помощь или предложения будут оценены.

1 Ответ

1 голос
/ 06 февраля 2020

Проблема в том, что вы думаете, что виджеты, размещенные в макете, являются дочерними элементами макета, но нет, эти виджеты являются дочерними элементами виджета, в котором был создан макет, поэтому в вашем коде "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();
            }
        }
    }
}
...