Eigenes TableModel

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Eigenes TableModel

Beitrag von Domar »

Hallo erstmal!

Ich arbeite mit Qt4 unter Linux.

Mein Ziel ist es, meine Variablen in einer Tabelle darzustellen. Eigentlich ein einfaches Unterfangen, doch irgendwie hab ich das mit dem TableModel nicht ganz verstanden.

Also: Ich hab mal QAbstractTableModel abgeleitet und ein eigenes gemacht. Diese Klasse müsste eigentlich passen und lässt sich auch compilen. Das Problem liegt eigentlich nur noch in der Einbindung in die QTableView.

Ich erzeuge mein TableModel im Konstruktor der Hauptklasse mit

Code: Alles auswählen

ButtonTableModel btm=new ButtonTableModel(&setList, ui.cbSets, ui.cbTabs, this);

Danach versuch ich es mit

Code: Alles auswählen

ui.tvTabContent->setModel(&btm);
mit dem TableView zu verbinden.

Allerdings schmeißt mir der Compiler folgenden Error:

Code: Alles auswählen

Anmerkung: künstlich erzeugte Methode »ButtonTableModel::ButtonTableModel(const ButtonTableModel&)« zuerst hier erfordert	
bei der Erzeugung des Models.

Der Konstruktorkopf des Models lautet wie folgt

Code: Alles auswählen

ButtonTableModel(QList<KeyboardSet *> *setList, QComboBox *cbSets, QComboBox *cbTabs, QObject *parent);
Außerdem gibts noch einen

Code: Alles auswählen

Fehler: in diesem Zusammenhang
in dieser Zeile des Model Headers:

Code: Alles auswählen

class ButtonTableModel : public QAbstractTableModel {




Sind sicher alles Anfängerfehler, aber die machen mir als C++ Neuling stark zu schaffen!

Danke schon mal für eure Antwort
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Re: Eigenes TableModel

Beitrag von Mani99 »

Domar hat geschrieben:

Code: Alles auswählen

ButtonTableModel btm=new ButtonTableModel(&setList, ui.cbSets, ui.cbTabs, this);


Der Konstruktorkopf des Models lautet wie folgt

Code: Alles auswählen

ButtonTableModel(QList<KeyboardSet *> *setList, QComboBox *cbSets, QComboBox *cbTabs, QObject *parent);
Bist du sicher das ui.cbSets und ui.cbTabs pointer sind?
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Beitrag von Domar »

Ja, eigentlich schon.

Mit ui.cbSets greif ich auf die mit dem Qt Designer erstellte Combobox zu.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

1. Wenn du schon Pointer möchtest (was in diesem Fall auch richtig ist), dann nimm auch welche:

Code: Alles auswählen

// ButtonTableModel btm=new ButtonTableModel(&setList, ui.cbSets, ui.cbTabs, this);
ButtonTableModel *btm=new ButtonTableModel(&setList);
ui.tvTabContent->setModel(btm);
2. Das Model sollte nur Daten (in irgendwelcher Form) verwalten und darf nichts mit der GUI zu tun haben! Wenn die im Model enthaltenen Daten aus der Combobox bezogen werden müssen, sollten diese via SIGNAL/SLOT an das Model gereicht werden und umgekehrt (Wenn der User eine Zeile anklickt und du die Combobox ändern möchtest, solltest du auf das Signal der TableView reagieren und dann die Daten aus dem Model nehmen).

hth...
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Beitrag von Domar »

Danke!

Problem erstmal gelöst ;)

Die Daten, die auf der Tabelle angezeigt werden sind abhängig von der auswahl in den Comboboxen. Soll auch in diesem Fall besser ein SIGNAL/SLOT Prinzip eingerichtet werden?

Eine Frage habe ich noch: Leider werden die Daten in der Tabelle noch nicht angezeigt, die Header aber schon. Welche Funktionen MUSS ich denn alles ausimplementieren? Die Tabelle soll nur anzeigen und sonst nichts!
Bereits implementiert hab ich die rowCount(), columnCount(), data() und headerData().

Ein Freund von mir meinte, dass ich die createIndex() Funktion auch brauchen werde, konnte mir dazu aber keine genaueren Infos geben. Ich hab leider auch nichts passendes hierzu gefunden und keine Ahnung für was die Funktion da ist bzw wie ich sie ausimplementiere.


Meine data Funktion:

Code: Alles auswählen

QVariant ButtonTableModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
        return QVariant();

    if(index.row() >= list->size() || index.row() < 0)
        return QVariant();

    if(role == Qt::DisplayRole) 
    {
        KeyboardButton *b = list->at(cbSet->currentIndex())->getTabList()->at(cbTab->currentIndex())->getButtonList()->at(index.row());

        if(index.column() == 0)
            return b->getTriggerShown();
        else if(index.column() == 1)
            return b->getTriggerReal();
        else if(index.column() == 2)
            return b->getValue();
        else if(index.column() == 3)
            return b->getValueType();
    }
    return QVariant();
}
Ach ja! Was ist role?


mfg Domar
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Die Daten, die auf der Tabelle angezeigt werden sind abhängig von der auswahl in den Comboboxen. Soll auch in diesem Fall besser ein SIGNAL/SLOT Prinzip eingerichtet werden?
Ja, unbedingt!
Welche Funktionen MUSS ich denn alles ausimplementieren?
Die abstrakten :wink:. Da du das Programm starten kannst, hast du alles, was du mindestens brauchst (sonst hätte der Compiler abgebrochen). Die wichtigsten sind "columnCount()", "rowCount()" und "data()".
Ein Freund von mir meinte, dass ich die createIndex() Funktion auch brauchen werde,
Nein... nicht für deine Anwendung.
Ach ja! Was ist role?
Die (Table)View fragt unterschiedliche Infos zu einer Zelle ab. Wie z.B. Tooltip oder die Hintergrundfarbe. Mit "role" sagt sie dir, welche Info sie haben möchte. Mindestens kennen sollte dein Model "DisplayRole" (=angezeigte Daten).

Leider werden die Daten in der Tabelle noch nicht angezeigt,
Verifizier (mit Debugger oder qDebug()), dass dein Model das tut, was es soll:

Code: Alles auswählen

int ButtonTableModel::columnCount() {
  qDebug() << "Model::columnCount() 4"
  return 4;
}
int ButtonTableModel::rowCount() {
  qDebug() << "Model::rowCount() " << list.count();
  return list.count();
}
QVariant ButtonTableModel::data(const QModelIndex &index, int role) const
{
   ...
    if(role == Qt::DisplayRole)
    {
      qDebug() << "Model::data" << index << cbSet->currentIndex();
     KeyboardButton *b = list->at(cbSet->currentIndex())->getTabList()->at(cbTab->currentIndex())->getButtonList()->at(index.row());
     qDebug() << "Model::data" << b->getTriggerShown();
  
     ....usw.

hth..
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Beitrag von Domar »

Danke!
Ist ein guter Ansatz ;)

Die rowCount() und columnCount() Funktion stimmt, allerdings scheint es, als würde die data() funktion nie aufgerufen werden.
Muss ich mich da selber drum kümmern?


mfg Domar
Antworten