Seite 1 von 1

Compiller fehler mit QAbstractTableModel

Verfasst: 6. November 2008 14:32
von thereapman
Hi!

Folgendes Problem:
Ich hab ein Model gebaut das von QAbstractTableModel erbt. nun Ist der Compiller aber damit nicht glücklich und wirft folgende Fehler:

Code: Alles auswählen

mainwindow.cpp:228: Fehler: es kann kein Objekt des abstrakten Typs »TableModel« belegt werden
TableModel.h:15: Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »TableModel«:
/usr/include/qt4/QtCore/qabstractitemmodel.h:173: Anmerkung: 	virtual int QAbstractItemModel::rowCount(const QModelIndex&) const
/usr/include/qt4/QtCore/qabstractitemmodel.h:174: Anmerkung: 	virtual int QAbstractItemModel::columnCount(const QModelIndex&) const
/usr/include/qt4/QtCore/qabstractitemmodel.h:177: Anmerkung: 	virtual QVariant QAbstractItemModel::data(const QModelIndex&, int) const
Code aus mainwindow.cpp

Code: Alles auswählen

	TableModel *auslagermodel = new TableModel();
	auslagermodel->setTableData(auslager_data);
TableModel.h

Code: Alles auswählen

#ifndef TABLEMODEL_H_
#define TABLEMODEL_H_

#include <QAbstractTableModel>
#include <QList>
#include <QStringList>

class TableModel : QAbstractTableModel {

	Q_OBJECT

public:
	TableModel(QObject *parent = 0)
    : QAbstractTableModel(parent) {}

	int rowCount(const QModelIndex & parent );
	int columnCount(const QModelIndex & parent);
	QVariant data(const QModelIndex & index, int role);
	QVariant headerData( int section, Qt::Orientation orientation, int role);
	bool setTableData(QList<QStringList>);
	bool appendHeaderData(QString);

	virtual ~TableModel();

private:
	QList<QStringList> tabledata;
	QStringList header;
};
#endif /* TABLEMODEL_H_ */
Tablemodel.cpp

Code: Alles auswählen

#include "TableModel.h"

TableModel::TableModel() : QAbstractTableModel(parent) {
	// TODO Auto-generated constructor stub

}

TableModel::~TableModel() {
	// TODO Auto-generated destructor stub
}


int TableModel::rowCount(const QModelIndex & parent = QModelIndex() )
{
	return tabledata.size();

}

int TableModel::columnCount(const QModelIndex & parent = QModelIndex())
{
	return tabledata.at(0).size();
}

QVariant TableModel::data(const QModelIndex & index, int role = Qt::DisplayRole)
{

	if(index.isValid() && role == Qt::DisplayRole && !(tabledata.isEmpty()))
		return tabledata.at(index.row()).at(index.column());
	else
		return QVariant();
}

QVariant TableModel::headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole)
{
	if(orientation == Qt::Horizontal)
		return header.at(section);
	else
		return QVariant();
}

bool TableModel::setTableData(QList<QStringList> input)
{
	tabledata = input;
	return true;
}

bool TableModel::appendHeaderData(QString input)
{
	header.append(input);
	return true;
}

Ich find den Fehler nicht.

Verfasst: 6. November 2008 15:42
von Christian81

Code: Alles auswählen

 int rowCount(const QModelIndex & parent ); 
ist nicht gleich diesem:

Code: Alles auswählen

 int rowCount(const QModelIndex&) const 
...

Verfasst: 6. November 2008 16:39
von RHBaum

Code: Alles auswählen

int TableModel::rowCount(const QModelIndex & parent = QModelIndex() )
{
   return tabledata.size();

} 
Das macht dein compiler mit ? default parameter deklarition in der definition ??? Meiner mag das ueberhaupt ned ^^

in der deklaration deiner klasse, bei den überladen funktionen sollte man das "virtual" mitschleppen, rein technisch bringts zwar ned viel, weil die dinger soweiso virtual werden ... aber fuer die uebersicht isses besser.

und an sonsten, wie Christian81 scho schreibt, die const vereinbarung an methoden gehoert zur signatur !
Damit hasst die ne neue rowCount() Methode gebaut (ohne const zwang), und nicht die alte ueberschrieben :-)

Ciao ....

Verfasst: 6. November 2008 18:12
von thereapman
Danke für den Fingerzeig!
Die Daten werden jetz korrekt angezeigt.

Ein Problem hab ich aber noch:
Ich bekomm es nicht hin das er mir nen Header über die Tabelle schreibt.
Er geht zwar in die überladene Funktion headerData() rein und bekommt eigentlich auch Daten zurückgeliefert (QStrings) zeigt allerdings gar keinen Header an. auch ein setHeaderHidden(false) bringt keine Punkte.

Hiernochmal bissl Quellcode:
"header" ist eine QStringList die vorher auch sauber gefüllt wird.

Code: Alles auswählen

QVariant TableModel::headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
{
	qDebug() << "GETHEADER" << section << orientation << role;
	if(orientation == Qt::Horizontal)
	{
		qDebug() << header.at(section);
		QVariant ret = header.at(section);
		return ret;
	}
	else
		return QVariant();
}