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
[gelöst] frage zum model/view framework
-
netchamber2
- Beiträge: 5
- Registriert: 17. August 2007 10:44
[gelöst] frage zum model/view framework
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
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();
}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()
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
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:
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;
}