Einstieg in Model-View-Konzept
-
Hi,
nach einer etwäs längeren (leider unschönen) Auszeit...
wenn ich den ersten Teil des Tutorials durcharbeite, sollte doch shcon die XML-Datei angezeigt werden oder?
Wenn ich aber in den CdModel::data() einen Haltepunkt setzt springe ich dort nie rein, in CdModel::rowCount() oder so aber schon. Könnte ich dort noch etwas vergessen haben?<code>
m_model = new CdModel(m_data, this);
m_view = new QTableView;
m_view->setModel(m_model);
m_view->setAlternatingRowColors(true);
setCentralWidget(m_view);
</code>Die Spaltenüberschriften werden im View übrigens auch nicht angezeigt.
Ich vermute mal einen Flüchtigkeitsfehler meinerseits...Gruß Thorben
-
Hi,
Ich hab mir das zip file aus dem "Beispiel 1":https://docs.google.com/uc?id=0B8PL33_OKajLNmE4NjNiMTMtZmZjYS00NDQyLThiZjEtMTU3MDkwZTk2YmZk&export=download&authkey=CIbe3rQK&hl=en heruntergeladen und das gebaut und gestartet und das geht :-)
-
Ok dann habe ich wohl sowas wie einen "Copy-Paste"-Fehler. Denn wenn ich z. B. das StringListModel aus dem Assistant verwende, funktioniert das auch. Gibt es einen Part (aus deiner Erfahrung) den man bei MV-Prog. gerne vergisst oder Fehler einbaut? Btw. unter welchen Umständen wird die data()-Methode nicht aufgerufen.
-
Hier noch cdmodel.cpp
<code>
#include <QtGui/QMessageBox>
//lokale "includes"
#include "cdmodel.h"CdModel::CdModel(CdRack& data, QObject* parent) : QAbstractItemModel(parent), m_data(data)
{
connect(&m_data, SIGNAL(reset()), this, SLOT(reloead()));
connect(&m_data, SIGNAL(inserted(int)), this, SLOT(inserted(int)));
connect(&m_data, SIGNAL(inserted(int, int)), this, SLOT(inserted(int, int)));m_columns.append(tr("Title"));
m_columns.append(tr("Author"));
m_columns.append(tr("Genre"));
m_columns.append(tr("Year"));
}
QModelIndex CdModel::index(int row, int column, const QModelIndex &parent) const
{
//if(!parent.isValid())
if(parent.isValid()) //Evtl. muss hier negiert werden
{
return QModelIndex();
}if((0 <= row) && (row < rowCount()) &&
(0 <= column) && (column < columnCount()))
{
return createIndex(row, column); //Index für Zugriff von außen erstellen
}
return QModelIndex();
}
QModelIndex CdModel::parent(const QModelIndex &child) const
{
return QModelIndex();
}int CdModel::rowCount(const QModelIndex &parent) const
{
//QMessageBox::information(0, tr(""), tr("in CdModel::rowCount"));
return m_data.size();
}
int CdModel::columnCount(const QModelIndex &parent) const
{//QMessageBox::information(0, tr(""), tr("in CdModel::columnCount"));
//if(!parent.isValid())
if(parent.isValid()) //Evtl. muss das negiert werden ?????
{
return 0;
}
return m_columns.count();
}
QVariant CdModel::data(const QModelIndex &index, int role) const
{
QMessageBox::information(0, tr(""), tr("in CdModel::data()"));
if(!index.isValid())
{
return QVariant();
}
if(Qt::DisplayRole == role)
{
const CdDisk& rDisk = m_data.at(index.row());
switch(index.column())
{
case 0:
return rDisk.m_title;
break;
case 1:
return rDisk.m_author;
break;
case 2:
return rDisk.m_genre;
break;
case 3:
return rDisk.m_year;
break;
}
}
return QVariant();
}
QVariant CdModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if( (Qt::DisplayRole == role) && (Qt::Horizontal == orientation) &&
(0 <= section) && (section < columnCount()))
{
return m_columns.at(section);
}
return QVariant();
}void CdModel::reload()
{
reset();
}
void CdModel::inserted(int nPosition)
{
//TODO
}
void CdModel::inserted(int nFirst, int nLast)
{
//TODO
}
</code> -
Benutz bitte mal das original beispiel projekt und teste, ob das bei dir geht.
Evtl hast du im header auch irgendwo ein const zuviel / zuwenig etc...Spontan sehe ich keinen fehler. Oder du postest mal deinen gesamten code via pastebin oder so gitorious oder so
-
-
Morgen,
in den bisherigen XML-Dateien befinden sich ja nur wenige Informationen.
Ich überlege mir, ob man z. B. über einen Doppelklick auf einen Eintrag nicht eine weitere XML-Datei öffnen könnte, die weitere Informationen enthält z. B. die komplette Titelliste einer CD oder so .... -
Da kann man viel machen, auch eine CDDB anbindung wäre vorstellbar, aber um MVC zu zeigen langt es meiner Meinung nach :-)
Das mit den Titellisten hatte ich mir auch schon überlegt, so als Tree dann, mal sehen. In letzter Zeit kam (außer jetzt von dir) gar keine Rückmeldung mehr, von daher habe ich nicht mehr dran weitergemacht.
-
Danke fürs Tutorial! Das war echt hilfreich.
Ich habe hier ein sehr kurzes Beispielprojekt, das eigene Items über QAbstractItemDelegate::paint() zeichnet: http://granjow.net/uploads/temp/ModelViewTest.tar.bz2 Lässt sich das eventuell auch irgendwo verwenden?