Qt-interest Archive, April 2007
Problem with MVC
Message 1 in thread
Hi everyone,
I've been trying to get my mvc architecture to work. What i did so far
is to implement a custom tablemodel a respective tableview and so forth.
I have two problems, though:
1) QItemDelegate::paint(), which in turn calls QModelIndex::data() is
called in seemingly an endless loop. My tablemodel::data() method is
called without end always returning the right piece of data. How can
this happen
2) The header data is not shown. I implemented headerData() but
somehow, none of my QStrings is shown in the tableview. Interestingly
headerData() is never called...
Here's a part of my code, that might help:
bool BibtexTableModel::setData(const QModelIndex & index, const
QVariant & value, int role)
{
if(!index.isValid())
return false;
if(role != Qt::EditRole)
return false;
int row = index.row();
QList<QString> *list;
if (_data.size() == 0)
{
QList<QString> *list = new QList<QString>();
list->insert(0, value.toString());
_data.append(list);
emit dataChanged(index, index);
return true;
}
else if(_data.size() >= row)
{
list = _data.at(row-1);
list->insert(index.column(), value.toString());
emit dataChanged(index, index);
return true;
}
else
{
QList<QString> *list = new QList<QString>();
list->insert(0, value.toString());
_data.append(list);
emit dataChanged(index, index);
return true;
}
}
QVariant BibtexTableModel::headerData(int section, Qt::Orientation
orientation,
int role)
{
QVariant var;
cout << "Section " << section << endl;
switch(section)
{
case 1:
var.setValue(QString(tr("KindOfEntry")));
break;
case 0:
var.setValue(QString(tr("CiteKey")));
break;
case 2:
var.setValue(QString(tr("Author")));
break;
case 3:
var.setValue(QString(tr("Title")));
break;
case 4:
var.setValue(QString(tr("Year")));
break;
case 5:
var.setValue(QString(tr("In")));
break;
}
return var;
}
QVariant BibtexTableModel::data(const QModelIndex & index, int role)
const
{
if(!index.isValid())
return QVariant();
if((index.row() < 0) || (index.row() >= _data.size()))
return QVariant();
if(role != Qt::DisplayRole)
return QVariant();
int row = index.row();
int col = index.column();
QList<QString> *list;
if(row == 0)
list = _data.at(row);
else
list = _data.at(row);
cout << "Data: QString: " <<
list->at(index.column()).toStdString() << endl;
return list->at(index.column());
}
Christian Rengstl M.A.
Klinik und Poliklinik fÃr Innere Medizin II
Kardiologie - Forschung
UniversitÃtsklinikum Regensburg
B3 1.388
Franz-Josef-Strauss-Allee 11
93053 Regensburg
Tel.: +49-941-944-7230
--
[ signature omitted ]