Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Григорий от Март 20, 2012, 19:10



Название: вопрос по QTableWidgetItem
Отправлено: Григорий от Март 20, 2012, 19:10
Добрый день форумчане , есть вот такой кусок кода
Код:
 QTableWidgetItem* ti;
  connectTable->setRowCount(connectTable->rowCount()+1);
  for (int i=0; i<6; i++) {
   ti = new QTableWidgetItem("");
   connectTable->setItem(connectTable->rowCount()-1,i,ti);
  }

сама таблица состоит из 6 колонок, пытаюсь создать пустые текстовые итемы, но на строке connectTable->setItem(connectTable->rowCount()-1,i,ti); происходит вылет программы..., что я сделал не так?


Название: Re: вопрос по QTableWidgetItem
Отправлено: kambala от Март 20, 2012, 20:05
а columnCount ты таблице задал?


Название: Re: вопрос по QTableWidgetItem
Отправлено: Григорий от Март 20, 2012, 22:11
а columnCount ты таблице задал?
да я самой таблице при создании задал размерность 1 строка 6 колонок


Название: Re: вопрос по QTableWidgetItem
Отправлено: kambala от Март 20, 2012, 22:26
в приведенном тобой коде connectTable->rowCount() возвращает правильное значение перед и после увеличения количества колонок?


Название: Re: вопрос по QTableWidgetItem
Отправлено: V1KT0P от Март 20, 2012, 22:27
а columnCount ты таблице задал?
да я самой таблице при создании задал размерность 1 строка 6 колонок
По опыту скажу, если выложишь минимальный проект с этим багом - то тебе быстрее помогут.


Название: Re: вопрос по QTableWidgetItem
Отправлено: Bepec от Март 20, 2012, 22:31
сама таблица состоит из 6 колонок, пытаюсь создать пустые текстовые итемы, но на строке connectTable->setItem(connectTable->rowCount()-1,i,ti); происходит вылет программы..., что я сделал не так?

Берём строку:
connectTable->setItem(connectTable->rowCount()-1,i,ti);
Подставляем количество строк 0 ( в первой итерации цикла).
Получаем
connectTable->setItem(-1,i,ti);

Профит?!
установить в -1 наврядли оно сможет ;)


Название: Re: вопрос по QTableWidgetItem
Отправлено: mutineer от Март 20, 2012, 22:34
сама таблица состоит из 6 колонок, пытаюсь создать пустые текстовые итемы, но на строке connectTable->setItem(connectTable->rowCount()-1,i,ti); происходит вылет программы..., что я сделал не так?

Берём строку:
connectTable->setItem(connectTable->rowCount()-1,i,ti);
Подставляем количество строк 0 ( в первой итерации цикла).
Получаем
connectTable->setItem(-1,i,ti);

Профит?!
установить в -1 наврядли оно сможет ;)

с чего бы количеству строк быть нулем, если перед циклом оно увеличивается на 1?


Название: Re: вопрос по QTableWidgetItem
Отправлено: Григорий от Март 21, 2012, 08:35
По опыту скажу, если выложишь минимальный проект с этим багом - то тебе быстрее помогут.

Пользуюсь вашим советом выкладываю минимум с этим багом

Код:
#include <QtGui>

class OptionDialog : public QDialog {
 Q_OBJECT
 public:
  OptionDialog();
 public slots:
  void tableEdit(int, int);
};

Код:
#include <QtGui>
#include "main.h"

OptionDialog::OptionDialog() {
 QTableWidgetItem* ti;
 QVBoxLayout* vl = new QVBoxLayout;
 setLayout(vl);
 QTableWidget* connectTable = new QTableWidget(1,6);
 vl->addWidget(connectTable);
 for (int i=0; i<6; i++) {
  ti = new QTableWidgetItem("");
  connectTable->setItem(0,i,ti);
 }
 connect(connectTable,SIGNAL(cellChanged(int, int)),SLOT(tableEdit(int, int)));
}

void OptionDialog::tableEdit(int row, int col) {
 QTableWidget* connectTable = qobject_cast<QTableWidget*>(sender());
 int count=0;
 QTableWidgetItem* ti;
 for (int i=0; i<4; i++) if (connectTable->item(connectTable->rowCount()-1,i)->text()!="") count+=1;
 if (count==4) {
  connectTable->setRowCount(connectTable->rowCount()+1);
  for (int i=0; i<6; i++) {
   ti = new QTableWidgetItem("");
   connectTable->setItem(connectTable->rowCount()-1,i,ti);
  }
 }
}

int main(int argc, char *argv[]) {
 QApplication app(argc, argv);
 OptionDialog mainWin;
 mainWin.show();
 return app.exec();
}


Название: Re: вопрос по QTableWidgetItem
Отправлено: Григорий от Март 21, 2012, 08:42
в приведенном тобой коде connectTable->rowCount() возвращает правильное значение перед и после увеличения количества колонок?

да вывожу значение через мессагу, все ровно


Название: Re: вопрос по QTableWidgetItem
Отправлено: BRE от Март 21, 2012, 08:56
А ты попробуй этот код вызвать не из слота обработчика cellChanged.


Название: Re: вопрос по QTableWidgetItem
Отправлено: V1KT0P от Март 21, 2012, 09:40
По опыту скажу, если выложишь минимальный проект с этим багом - то тебе быстрее помогут.

Пользуюсь вашим советом выкладываю минимум с этим багом

Код:
#include <QtGui>

class OptionDialog : public QDialog {
 Q_OBJECT
 public:
  OptionDialog();
 public slots:
  void tableEdit(int, int);
};

Код:
#include <QtGui>
#include "main.h"

OptionDialog::OptionDialog() {
 QTableWidgetItem* ti;
 QVBoxLayout* vl = new QVBoxLayout;
 setLayout(vl);
 QTableWidget* connectTable = new QTableWidget(1,6);
 vl->addWidget(connectTable);
 for (int i=0; i<6; i++) {
  ti = new QTableWidgetItem("");
  connectTable->setItem(0,i,ti);
 }
 connect(connectTable,SIGNAL(cellChanged(int, int)),SLOT(tableEdit(int, int)));
}

void OptionDialog::tableEdit(int row, int col) {
 QTableWidget* connectTable = qobject_cast<QTableWidget*>(sender());
 int count=0;
 QTableWidgetItem* ti;
 for (int i=0; i<4; i++) if (connectTable->item(connectTable->rowCount()-1,i)->text()!="") count+=1;
 if (count==4) {
  connectTable->setRowCount(connectTable->rowCount()+1);
  for (int i=0; i<6; i++) {
   ti = new QTableWidgetItem("");
   connectTable->setItem(connectTable->rowCount()-1,i,ti);
  }
 }
}

int main(int argc, char *argv[]) {
 QApplication app(argc, argv);
 OptionDialog mainWin;
 mainWin.show();
 return app.exec();
}
Короче проблема вот в чем:
1) Ты создаешь новую строку и начинаешь добавлять элементы.
2) При создании первого элемента вызывается слот элемента.
3) Ты начинаешь проверять первые четыре элемента. НО! Создался только первый элемент а 2,3 и 4-й элементы еще не созданы. При попытке обратиться к несуществующему элементу программа падает.

Вот так измени обход элементов и будет работать:
Код
C++ (Qt)
for (int i=0; i<4; i++)
   if (connectTable->item(connectTable->rowCount()-1,i))
       if (connectTable->item(connectTable->rowCount()-1,i)->text()!="")
       count+=1;


Название: Re: вопрос по QTableWidgetItem
Отправлено: Григорий от Март 21, 2012, 09:49
Короче проблема вот в чем:
1) Ты создаешь новую строку и начинаешь добавлять элементы.
2) При создании первого элемента вызывается слот элемента.
3) Ты начинаешь проверять первые четыре элемента. НО! Создался только первый элемент а 2,3 и 4-й элементы еще не созданы. При попытке обратиться к несуществующему элементу программа падает.

Вот так измени обход элементов и будет работать:
Код
C++ (Qt)
for (int i=0; i<4; i++)
   if (connectTable->item(connectTable->rowCount()-1,i))
       if (connectTable->item(connectTable->rowCount()-1,i)->text()!="")
       count+=1;

все дошло , забыл эфект рекурсии я же выделяю элемент а он порождает еще один вход в этот слот ))

вопрос закрыт  всем спасибо...


Название: Re: вопрос по QTableWidgetItem
Отправлено: kambala от Март 21, 2012, 13:49
ещё сделай таблицу полем класса