Trolltech Home | Qt-interest Home | Recent Threads | All Threads | Author | Date
All threads index page 1

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 ]