Ошибка сегментации QTableWidget setItem () с использованием Qt - PullRequest
0 голосов
/ 26 марта 2011

Я использую следующий код для добавления строки в QTableWidget.

QTableWidgetItem *item = new QTableWidgetItem(fileName);
item->setCheckState(Qt::Checked);

QComboBox *cmb = new QComboBox(this->list);
cmb->addItem("one");
cmb->addItem("two");

this->list->setRowCount(this->list->rowCount()+1);
this->list->setItem(this->list->rowCount()-1,0,item);
this->list->setCellWidget(this->list->rowCount()-1,1,cmb);

В таблице 2 столбца. 'item' помещается в первый, 'cmb' во второй. Используя этот код, я могу успешно добавить 1 строку в таблицу, но при попытке добавить вторую строку я получаю ошибку сегментации Сбой при вызове this-> list-> setItem ().

Есть идеи, почему происходит сбой?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 02 августа 2016

Эта проблема в моем коде произошла из-за логики в cellChanged SLOT.Я пытался установить текст в QTableWidget, который еще не был создан.

0 голосов
/ 15 сентября 2012

У меня был код, который был очень похож на вас, и он тоже зависал ...

QTableWidgetItem* columnOne = new QTableWidgetItem();
columnOne->setCheckState(Qt::Checked);
QTableWidgetItem* columnTwo = new QTableWidgetItem("Some Text");

int row = tableWidget->rowCount();
tableWidget->insertRow(row);
tableWidget->setItem(row, 0, columnOne);
tableWidget->setItem(row, 1, columnTwo);

Однако, если я изменил порядок вызовов setItem, чтобы состояние проверки добавлялось последним, тогда оноработал.Так что это код работал ...

QTableWidgetItem* columnOne = new QTableWidgetItem();
columnOne->setCheckState(Qt::Checked);
QTableWidgetItem* columnTwo = new QTableWidgetItem("Some Text");

int row = tableWidget->rowCount();
tableWidget->insertRow(row);
tableWidget->setItem(row, 1, columnTwo);
tableWidget->setItem(row, 0, columnOne);
0 голосов
/ 04 июня 2013

Проблема находится в этой строке (вы назвали некоторый список и QTableWidget одинаковым: "список"):

этом-> list-> setRowCount (этом-> list-> ROWCOUNT () + 1)

this->list->rowCount()+1 всегда будет возвращать 0 + 1 = 1, поэтому вы можете добавить в таблицу первую, а не вторую строку.

Решение : назовите свой QTableWidget, отличный от «list», например:

this->myTableWidget->setRowCount(this->list->rowCount()+1);
this->myTableWidget->setItem(this->list->rowCount()-1,0,item);
this->myTableWidget->setCellWidget(this->list->rowCount()-1,1,cmb);
0 голосов
/ 27 марта 2011

Я не могу сказать, почему ваш код не работает как есть, но сделайте это:

int N = list->rowCount(); //The problem may lie in multiple rowCount() calls somehow
list->insertRow(N);
list->setItem(N,0,item);
list->setCellWidget(N,1,cmb);

Кроме того, есть ли конкретная причина, по которой вы используете 'this->'? Как правило, в этой ситуации это полностью избыточно.

...