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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с созданием QTableWidgetItem  (Прочитано 6535 раз)
smallmazila
Гость
« : Июнь 04, 2009, 07:13 »

Суть задачи такова: создаю таблицу QTableWidget, которая является центральным виджетом для QMainWindow. Таблица изначально пуста.
Теперь мне нужно заполнить эту таблицу необходимыми значениями. Для этого в книжке Бланшет, Саммерфилд "Qt 4: программирование  GUI на С++" описан алгоритм.
Вот код:
Код:
void Spreadsheet::setFormula(int row, int column, const QString &formula)
{
Cell* c = cell(row, column);
if (!c)
{
c = new Cell;
setItem(row, column, c);
}
c->setFormula(formula);
}
здесь класс Cell унаследован от QTableWidgetItem.
Перенес тот же код в свою программу.
Получилось:
Код:
void VectorizerResultTable::setValue(int row, int column, const QString &value)
{
Cell *c = cell(row, column);
if (!c)
{
c = new Cell;
setItem(row, column, c);
}
c->setValue(value);
}
свой класс Cell также унаследован от QTableWidgetItem
функции cell и setValue раелизованы в классе Cell.
так он теперь выдает ошибку на строке c = new Cell;
Вот ошибка:
Microsoft C++ exception: CMemoryException at memory location 0x0cdda908..

Ясно что ошибка в выделении памяти.
Я с Qt работаю всего ничего и понять почему такая ошибка вылазит так и не смог.
Подскажите хоть какое-нибудь решение данной проблемы.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Июнь 04, 2009, 08:50 »

Приаттач код твоего проекта
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
smallmazila
Гость
« Ответ #2 : Июнь 04, 2009, 10:42 »

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

#include "stdafx.h"
#include <stdexcept>


VectorizerResultTable::VectorizerResultTable(QWidget *parent): QTableWidget(parent)
{
init();
}

VectorizerResultTable::~VectorizerResultTable()
{
}

void VectorizerResultTable::init()
{
clear();
setRowCount(0);
setColumnCount(0);
setRowCount(RowCount);
setColumnCount(ColumnCount);

QTableWidgetItem *item = new QTableWidgetItem;
item->setText(QString("Отметка"));
setHorizontalHeaderItem(0, item);


/* Cell *c;
for (int i = 0; i < 1000; i++)
{
c = newCell();
c->setText(QString("Пусто"));
setItem(i,0,c);
}
*/
setCurrentCell(0,0);
}

Cell* VectorizerResultTable::cell(int row, int column) const
{
return static_cast<Cell*>(item(row, column));
}

QString VectorizerResultTable::text(int row, int column) const
{
Cell* c = cell(row, column);
if (c)
{
return c->text();
}
else
{
return "";
}
}

Cell* VectorizerResultTable::newCell()
{
return new Cell;
}
bool VectorizerResultTable::setValue(int row, int column, const QString &value)
{

Cell *c = cell(row, column);
if (!c)
{
try
{
c = newCell();
}
catch(CMemoryException *exp)
{
return false;
}
setItem(row, column, c);
}
c->setValue(value);
return true;
}

bool VectorizerResultTable::setColumn(double* otmetki, int size)
{
QVariant value;
bool conue = true;

for (int i =0; i < size; ++i)
{
value = otmetki[i];
conue = setValue(i,0,value.toString());
if (!conue)
{
QMessageBox::warning(this,tr("VectorizerResultTable"),tr("Error in VectorizerResultTable::setColumn: Can not set value %1 to item(%2,%3)").arg(value.toString()).arg(i).arg(0));
return false;
}
}
return true;
}

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

Cell::Cell()
{
isEditable = false;
}

QTableWidgetItem *Cell::clone() const
{
return new Cell(*this);
}

QVariant Cell::data() const
{
return text();
}

void Cell::setIsEditable(bool isEditable_)
{
isEditable = isEditable_;
}

void Cell::setValue(const QString &value)
{
setData(Qt::DisplayRole, value);
}

вот два класса которые используются в проетке для работы с таблицей.
Записан
mugabe
Гость
« Ответ #3 : Июнь 04, 2009, 11:34 »

А так?

Код:
Cell::Cell():
  QTableWidgetItem(QTableWidgetItem::UserType)
{
  isEditable = false;
}
Записан
smallmazila
Гость
« Ответ #4 : Июнь 04, 2009, 11:47 »

Попробовал и так. Чет не помогает. Все те же ошибки.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Июнь 04, 2009, 12:12 »

А можешь прикрепить компилябельный пример, чтобы попробовать у себя

BWT: Какая версия Qt используется?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
smallmazila
Гость
« Ответ #6 : Июнь 04, 2009, 12:34 »

Версия QT 4.5.0
Как файлы прикладывать скажи?
Записан
smallmazila
Гость
« Ответ #7 : Июнь 04, 2009, 12:48 »

нашел! вот проект написан в Visual 2005
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Июнь 04, 2009, 13:36 »

Скампилил, запустил. Как воспроизвести ошибку?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Июнь 04, 2009, 13:45 »

Нашел ошибку, это либо невнимательность либо пробел в знаниях Подмигивающий

Сравни:

Код
C++ (Qt)
double *d_otmetki = new double(size);
for (int i = 0; i < size; ++i)
{
   d_otmetki[i] = 0.54;
}


Код
C++ (Qt)
double *d_otmetki = new double[size];
for (int i = 0; i < size; ++i)
{
   d_otmetki[i] = 0.54;
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
smallmazila
Гость
« Ответ #10 : Июнь 04, 2009, 13:51 »

Спасибо огромное, Pastor. Сам бы не в жизнь не догадался.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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