Russian Qt Forum
Ноябрь 24, 2024, 12:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по QTableWidgetItem  (Прочитано 5871 раз)
Григорий
Гость
« : Март 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); происходит вылет программы..., что я сделал не так?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 20, 2012, 20:05 »

а columnCount ты таблице задал?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Григорий
Гость
« Ответ #2 : Март 20, 2012, 22:11 »

а columnCount ты таблице задал?
да я самой таблице при создании задал размерность 1 строка 6 колонок
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Март 20, 2012, 22:26 »

в приведенном тобой коде connectTable->rowCount() возвращает правильное значение перед и после увеличения количества колонок?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
V1KT0P
Гость
« Ответ #4 : Март 20, 2012, 22:27 »

а columnCount ты таблице задал?
да я самой таблице при создании задал размерность 1 строка 6 колонок
По опыту скажу, если выложишь минимальный проект с этим багом - то тебе быстрее помогут.
Записан
Bepec
Гость
« Ответ #5 : Март 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 наврядли оно сможет Подмигивающий
Записан
mutineer
Гость
« Ответ #6 : Март 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?
Записан
Григорий
Гость
« Ответ #7 : Март 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();
}
« Последнее редактирование: Март 21, 2012, 08:38 от Григорий » Записан
Григорий
Гость
« Ответ #8 : Март 21, 2012, 08:42 »

в приведенном тобой коде connectTable->rowCount() возвращает правильное значение перед и после увеличения количества колонок?

да вывожу значение через мессагу, все ровно
Записан
BRE
Гость
« Ответ #9 : Март 21, 2012, 08:56 »

А ты попробуй этот код вызвать не из слота обработчика cellChanged.
Записан
V1KT0P
Гость
« Ответ #10 : Март 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;
Записан
Григорий
Гость
« Ответ #11 : Март 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;

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

вопрос закрыт  всем спасибо...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Март 21, 2012, 13:49 »

ещё сделай таблицу полем класса
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.