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



  • Wenn ich das noch richtig weiß, sind die screen shots direkt aus der applikation...
    Hast du den code übernommen oder 1:1 das beispiel gebaut?



  • Morgen,

    habe den Code so übernommen, aber ich werde nochmal durchgehen woran es liegen könnte.
    Also sollte die Applikation nach dem ersten Tutorial-Teil so wie im Screenshot arbeiten...



  • Eigentlich schon, wenn mich nicht alles täuscht...
    Ich werds nochmal vorsichtshalber ausprobieren.



  • 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.



  • Poste mal deinen model code, dann ist es vermuitlich leicht zu finden.
    data wird z.b. nicht aufgerufen, wenn rowCounf oder columnCount 0 liefern



  • 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



  • ORiginal-Projekt geht!
    Habe bei mir nochmal gesucht und den Fehler gefunden:
    -> rowCount() lieferte 0
    Evtl. wg. dieser Zeile:
    <code>
    connect(&m_data, SIGNAL(reset()), this, SLOT(reloead()));
    </code>

    Habe aus reloead() ein reloead() gemacht und es ging!



  • Ups,

    sollte reload() heißen



  • Puh, ich dachte schon, ich hätte vor dem zippen irgendwo noch einen bug eingebaut ... :-)



  • 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.



  • Moin,

    nun ja zum einen beschäftige ich mich im Beruf jetzt intensiver damit, zum anderen ist eine solche Applikation für die Verwaltung meiner eigenen CDs, DVDs oder sonstiges recht praktisch.



  • [quote author="thorben" date="1315374169"]... zum anderen ist eine solche Applikation für die Verwaltung meiner eigenen CDs, DVDs oder sonstiges recht praktisch.[/quote]

    Hehe, deswegen dachte ich mir, das wäre ein gutes Beispiel :-)



  • Das stimmt wohl :-)
    Wahrscheinlich hat sowas jeder zu Hause, aber selber machen, macht manchmal mehr Spaß, wenn man weiß wie ... daher in der Tat ein gutes Beispiel!



  • Mal sehen, evtl baue ich das mal noch fertig aus, aber wenn dann erst mit der Zeit....



  • 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?



  • Hallo jungs und mädels, frohe Weihnachten!!
    Ich beschäftige mich grad mit dem modell view konzept um eins meiner Projekte zu realisieren!
    Ich hab euer Tutorial gefunden und wollte es durcharbeiten! Aber leider sind alle links zu den dateien und des tutorials tot. Könntet ihr das tutorial vllt wieder auffrischen?
    Das wäre sehr hilfreich für mich!!
    Liebe Grüße!!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.