Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: smallmazila от Июнь 04, 2009, 07:13



Название: Проблема с созданием QTableWidgetItem
Отправлено: 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 работаю всего ничего и понять почему такая ошибка вылазит так и не смог.
Подскажите хоть какое-нибудь решение данной проблемы.


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: pastor от Июнь 04, 2009, 08:50
Приаттач код твоего проекта


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: smallmazila от Июнь 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);
}

вот два класса которые используются в проетке для работы с таблицей.


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: mugabe от Июнь 04, 2009, 11:34
А так?

Код:
Cell::Cell():
  QTableWidgetItem(QTableWidgetItem::UserType)
{
  isEditable = false;
}


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: smallmazila от Июнь 04, 2009, 11:47
Попробовал и так. Чет не помогает. Все те же ошибки.


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: pastor от Июнь 04, 2009, 12:12
А можешь прикрепить компилябельный пример, чтобы попробовать у себя

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


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: smallmazila от Июнь 04, 2009, 12:34
Версия QT 4.5.0
Как файлы прикладывать скажи?


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: smallmazila от Июнь 04, 2009, 12:48
нашел! вот проект написан в Visual 2005


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: pastor от Июнь 04, 2009, 13:36
Скампилил, запустил. Как воспроизвести ошибку?


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: pastor от Июнь 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;
}


Название: Re: Проблема с созданием QTableWidgetItem
Отправлено: smallmazila от Июнь 04, 2009, 13:51
Спасибо огромное, Pastor. Сам бы не в жизнь не догадался.