[gelöst] frage zum model/view framework

Alles rund um die Programmierung mit Qt
Antworten
netchamber2
Beiträge: 5
Registriert: 17. August 2007 10:44

[gelöst] frage zum model/view framework

Beitrag von netchamber2 »

hallo,

ich habe eine frame zum model/view framework in qt.

ich habe mir eine modelklasse geschrieben, die von qabstracttablemodel erbt. sie enthält eine qlist als interne datenstruktur. eine treeview zeigt das model an. das funktioniert auch alles ganz toll.

nun soll das model aber beschreibbar sein. dazu habe ich die flags, insertRow und die setData methoden für mein model implementiert. insertRow legt ein neues element in der qlist an. und setData emmittiert auch brav nachdem einfügen der übergebenen daten das dataChanged signal. ob die daten tatsächlich im model ankommen habe ich auch überprüft.... leider bekommt die view nichts von den neuen werten im model mit..

was mache ich denn falsch?

mit freundlichen grüßen - ingo
Zuletzt geändert von netchamber2 am 17. August 2007 18:34, insgesamt 1-mal geändert.
netchamber2
Beiträge: 5
Registriert: 17. August 2007 10:44

Beitrag von netchamber2 »

hier mal etwas code aus der model klasse:

Code: Alles auswählen

#include "carmodel.h"

QModelIndex CarModel::index ( int row, int column, const QModelIndex& parent ) const
{
	return QAbstractTableModel::index ( row, column, parent );
}


QVariant CarModel::headerData ( int section, Qt::Orientation orientation, int role ) const
{
	if ( role != Qt::DisplayRole )
		return QVariant();

	if ( orientation == Qt::Horizontal )
	{
		switch ( section )
		{
			case IdIndex:			return QString ( "ID" );
			case MarqueIndex: 		return QString ( "Marque" );
			case ModelIndex: 		return QString ( "Model" );
			case LocationIndex: 		return QString ( "Location" );
			case ColorIndex: 		return QString ( "Color" );
			case PsIndex: 			return QString ( "PS" );
			case YearOfManufactureIndex: 	return QString ( "Manufactured" );
			case KmIndex: 			return QString ( "KM" );
			case PriceIndex: 		return QString ( "Price" );
		}
		return QString ( "Column %1" ).arg ( section );
	}
	else
		return carList.at ( section ).getId();
}

QVariant CarModel::data ( const QModelIndex & index, int role ) const
{
	if ( !index.isValid() || index.row() >= carList.size() )
		return QVariant();

	if ( role == Qt::DisplayRole || role == Qt::EditRole )
	{
		Car car = carList.at ( index.row() );
		switch ( index.column() )
		{
			case IdIndex:			return car.getId();
			case MarqueIndex:		return car.getMarque();
			case ModelIndex:		return car.getModel();
			case LocationIndex:		return car.getLocation();
			case ColorIndex:		return car.getColor();
			case PsIndex:			return car.getPs();
			case YearOfManufactureIndex:	return car.getYearOfManu();
			case KmIndex: 			return car.getKm();
			case PriceIndex: 		return car.getPrice();
		}
		return QVariant();
	}
	return QVariant();
}

int CarModel::columnCount ( const QModelIndex & parent ) const
{
	Q_UNUSED ( parent );
	return 9;
}

int CarModel::rowCount ( const QModelIndex & parent ) const
{
	Q_UNUSED ( parent );
	return carList.size();
}

bool CarModel::setData ( const QModelIndex & index, const QVariant & value, int role )
{
	if ( index.isValid() && ( role == Qt::EditRole || role==Qt::DisplayRole ) )
	{
		switch ( index.column() )
		{
			case IdIndex:
				carList[index.row() ].setId ( value.toString() );
				break;
			case MarqueIndex:
				carList[index.row() ].setMarque ( value.toString() );
				break;
			case ModelIndex:
				carList[index.row() ].setModel ( value.toString() );
				break;
			case LocationIndex:
				carList[index.row() ].setLocation ( value.toString() );
				break;
			case ColorIndex:
				carList[index.row() ].setColor ( value.toString() );
				break;
			case PsIndex:
				carList[index.row() ].setPs ( value.toDouble() );
				break;
			case YearOfManufactureIndex:
				carList[index.row() ].setYearOfManu ( value.toInt() );
				break;
			case KmIndex:
				carList[index.row() ].setKm ( value.toInt() );
				break;
			case PriceIndex:
				carList[index.row() ].setPrice ( value.toInt() );
				break;
			default:
				return false;
		}
		emit dataChanged ( index,index );
		showDebugData();
		return true;
	}
	else
	{
		qDebug() << "CarModel::setData() skipped";
	}
	return false;
}

bool CarModel::insertRow ( int row, const QModelIndex & parent )
{
	Q_UNUSED ( row );
	Q_UNUSED ( parent );
	
	carList.append ( Car() );

	return true;
}

Qt::ItemFlags CarModel::flags ( const QModelIndex & index ) const
{
	if ( !index.isValid() )
		return 0;

	return QAbstractItemModel::flags ( index ) | Qt::ItemIsEditable;
}

void CarModel::showDebugData()
{
	for ( int i=0; i<carList.size(); i++ )
		qDebug() << "	" << carList.at ( i ).getId() << "   " << carList.at ( i ).getMarque();
}
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag von Zandru »

Redest du vom hinzufügen von neuen Daten?

schau mal hier:
http://doc.trolltech.com/4.3/model-view ... ssing.html
siehe insertRows() bzw. beginInsertRows() / endInsertRows()
netchamber2
Beiträge: 5
Registriert: 17. August 2007 10:44

Beitrag von netchamber2 »

ja ich will daten hinzufügen. deshalb habe ich ja insertRows und setData implementiert. wenn ich insertRows und setData ausführe wir mein interner datenspeicher (carList) ja auch weiter mit werten befüllt. aber obwohl ich das signal dataChanged(index, index) emmittiere, bekommt die tree view, die das model anzeigt, nichts von der änderung mit...

edit:
"When reimplementing insertRows() in a subclass, you must call this function before inserting data into the model's underlying data store." aha... mom

edit:
WOW! dankeschön.. okay also mein insertRow sieht jetzt folgendermaßen aus:

Code: Alles auswählen

bool CarModel::insertRow ( int row, const QModelIndex & parent )
{
	Q_UNUSED ( row );
	Q_UNUSED ( parent );
	
	beginInsertRows(parent, rowCount(), rowCount()+1);
		
	carList.append ( Car() );
	
	endInsertRows();

	return true;
}
Antworten