Russian Qt Forum

Qt => Вопросы новичков => Тема начата: UltraPenguin от Май 19, 2014, 14:46



Название: Странное поведение QTableWidget
Отправлено: UltraPenguin от Май 19, 2014, 14:46
Доброго времени суток!
Столкнулся со странным (для меня) поведением QTableWidget/QTableWidgetItem. Есть такой код:
Код:
    int iRow;
    QTableWidgetItem *item;
    for (int i = 0; i < sPortsList.size(); i++)
    {
        item = new QTableWidgetItem(sPortsList[i].split(";").at(1));
        if (sPortsList[i].split(";").at(0).toInt() == 1)
            item->setBackgroundColor(Qt::green);
        else
            item->setBackgroundColor(Qt::red);
        iRow = ui.tableWidgetPortsList->rowCount();
        ui.tableWidgetPortsList->insertRow(iRow);
        ui.tableWidgetPortsList->setItem(iRow, 0, item);
    }
, где sPortsList - QStringList.
При пошаговой отладке видно, как создается новый QTableWidgetItem в строке
Код:
item = new QTableWidgetItem(sPortsList[i].split(";").at(1));
с нужным текстовым значением.
Далее видно, что ему присваивается текст фоновой заливки в строках
Код:
        if (sPortsList[i].split(";").at(0).toInt() == 1)
            item->setBackgroundColor(Qt::green);
        else
            item->setBackgroundColor(Qt::red);
Но если попытаться вызвать метод
Код:
ui.tableWidgetPortsList->item(0, 0)->text();
внутри цикла сразу после вставки setItem, вылетает ошибка SIGSEGV  :-\
Соответственно на форме, где расположен данный QTableWidget отображаются просто пустые строки.
Как так происходит?
Вызов приведенного кода идет в конструкторе формы, где расположен данный QTableWidget.

Qt 4.8.3 если это имеет значение.

Заранее спасибо!


Название: Re: Странное поведение QTableWidget
Отправлено: OKTA от Май 19, 2014, 16:53
А ты уверен, что этот элемент существует?  8)
Проверил бы  ;)


Название: Re: Странное поведение QTableWidget
Отправлено: kambala от Май 19, 2014, 17:41
а не проще text() читать прямо у item?


Название: Re: Странное поведение QTableWidget
Отправлено: carrygun от Май 20, 2014, 04:49
Количество столбцов то указали?
Этот код работает на ура:
Код
C++ (Qt)
   tableWidget->setColumnCount(1);
   for (int i = 0; i < 3; ++i) {
       QTableWidgetItem *item = new QTableWidgetItem("test "+QString::number(i));
       tableWidget->insertRow(tableWidget->rowCount());
       tableWidget->setItem(tableWidget->rowCount()-1, 0, item);
   }
   qDebug() << tableWidget->item(1, 0)->text();
 


Название: Re: Странное поведение QTableWidget
Отправлено: UltraPenguin от Май 20, 2014, 14:22
А ты уверен, что этот элемент существует?  8)
Проверил бы  ;)
по ссылке item он доступен, но не вставляется в QTableWidget

а не проще text() читать прямо у item?
я так читал, чтобы проверить доступность элемента из QTableWidget.

Количество столбцов то указали?
да указывал перед этим setColumnCount(1) и присваивал имя столбца


Название: Re: Странное поведение QTableWidget
Отправлено: UltraPenguin от Май 20, 2014, 14:26
Этот код работает на ура:
Код
C++ (Qt)
   tableWidget->setColumnCount(1);
   for (int i = 0; i < 3; ++i) {
       QTableWidgetItem *item = new QTableWidgetItem("test "+QString::number(i));
       tableWidget->insertRow(tableWidget->rowCount());
       tableWidget->setItem(tableWidget->rowCount()-1, 0, item);
   }
   qDebug() << tableWidget->item(1, 0)->text();
 

По сути дела у меня тот же код. Причем на форме присутствует еще один QTableWidget, работающий по подобному алгоритму (только там 2 столбца) и работающий прекрасно! :(


Название: Re: Странное поведение QTableWidget
Отправлено: carrygun от Май 21, 2014, 04:35
Ну выглядит вроде верно. Остается только комментировать куски да гонять под отладчиком. Ну еще можно попробовать пересобрать проект, всякое бывает.


Название: Re: Странное поведение QTableWidget
Отправлено: UltraPenguin от Май 21, 2014, 09:25
Спасибо большое за ответы :), будем дальше шаманить