Seite 1 von 1

QTableView

Verfasst: 7. Oktober 2008 18:54
von reuabreliz
Also ich habe eine Tabelle QTableView mit dem QDesigner erstellt nun will ich die Tabelle füllen. Dazu habe ich gelesen gibt es in QT das Model-View Konzept. Mein View (QTableView) habe ich ja schon, also brauche ich noch mein Model (MyTableViewModel :) ) Dazu habe ich gefunden ich sollte die QAbstractTableModel ableiten. Also habe ich eine MyTableViewModel Klasse erstellt die von QAbstractTableModel erbt. Dann habe ich wichtige Funktionen wie removeRow() usw. eingebunden. Das funktioniert ja auch schön und gut aber wie greife ich auf die einzelnen Spalten zu?

Mein Quellcode falls er wem hilft mir zu helfen :D

MyTableViewModel.h

Code: Alles auswählen

#ifndef __MYTABLEVIEWMODEL_H__
#define __MYTABLEVIEWMODEL_H__

#include <QStringList>
#include <QAbstractTableModel>

class MyTableViewModel : QAbstractTableModel
{
	public:
		MyTableViewModel(QObject *parent = 0);

		~MyTableViewModel();
		
		int rowCount( const QModelIndex & parent = QModelIndex() );
		int columnCount( const QModelIndex & parent = QModelIndex() );
		QVariant data(const QModelIndex & index, int role = Qt::DisplayRole);
		QVariant headerdata( int section, Qt::Orientation orientation, int role = Qt::DisplayRole);
		
		bool setData( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
		Qt::ItemFlags flags( const QModelIndex & index );
		
		bool insertRows( int row, int count, const QModelIndex & parent = QModelIndex());
		bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex() );
		bool insertColumns( int column, int count, const QModelIndex & parent = QModelIndex() );
		bool removeColumns( int column, int count, const QModelIndex & parent = QModelIndex() );
	
}

#endif // __MYTABLEVIEWMODEL_H__
MyTableViewModel.cpp (ist noch nicht fertig)

Code: Alles auswählen

#include "MyTableViewModel.h"

MyTableViewModel::MyTableViewModel(QObject *parent) : QAbstractTableModel(parent)
{
	
}

int MyTableViewModel::rowCount( const QModelIndex & parent)
{
	
}
int MyTableViewModel::columnCount( const QModelIndex & parent)
{
	
}
QVariant MyTableViewModel::data(const QModelIndex & index, int role)
{
	
}
QVariant MyTableViewModel::headerdata( int section, Qt::Orientation orientation, int role)
{
	
}

bool MyTableViewModel::setData( const QModelIndex & index, const QVariant & value, int role)
{
	
}
Qt::ItemFlags MyTableViewModel::flags( const QModelIndex & index )
{
	
}

bool MyTableViewModel::insertRows( int row, int count, const QModelIndex & parent)
{
	beginInsertRows(QModelIndex(), row, count);
	
	endInsertRows();
}

bool MyTableViewModel::removeRows(int row, int count, const QModelIndex & parent)
{
	beginRemoveRows(QModelIndex(), row, count);
	
	endRemoveRows();
}

bool MyTableViewModel::insertColumns( int column, int count, const QModelIndex & parent)
{
	beginInsertColumns(QModelIndex(), column, count);
	
	endInsertColumns();
}

bool MyTableViewModel::removeColumns( int column, int count, const QModelIndex & parent)
{
	beginRemoveColumns(QModelIndex(), column, count);
	
	endRemoveColumns();
}


Verfasst: 7. Oktober 2008 19:32
von upsala
Eine QTableView muß man nicht unbedingt mit Designer erstellen, ein new TableView() reicht auch...

insert/remove Row/Column brauchst du nur wenn du über dein Programm auch so mit deinem Model kommunzieren willst. Manchmal reicht z.B. auch ein setMyData(MyData &data)

Welche Spalten?

Wenn du schon headerData überladen willst, dann achte auf die Groß- Kleinschreibung. Wir sind hier bei C++ und nicht beim MS-Dateisystem...

In der Doku gibt es ein schönes QStringListModel-Beispiel...

Verfasst: 7. Oktober 2008 20:56
von reuabreliz
Mein Widget besteht ja nicht nur aus diesem TableView(). Hat auch ein Menue.

Also zur kompletten Funktion. Des MyTableView.
- Soll Daten (Prüfungsdaten) aus einer Datenbank ausgeben.
- Wenn man auf ein Feld klickt (da die Tabellen verschachtelt sind) Soll er dann in die andere Tabelle springen und zu dem angeklickten Datensatz alle Daten ausgeben. Dort können dann Werte geändert werden. Mit einem Zurückbutton wieder zurück.
(z.B.: Spalten: Prüfung, Lehrer, Schüler. WEnn man dann auf einen Lehrer in der Tabelle klickt springt er in die Tabelle Lehrer wählt diesen Lehrer aus und gibt dann erweiterte Infos aus. SQL Tabellen dazu: Tabelle Prüfung mit Spalten, id, prüfung, lehrer_id (die mit der Lehrer Tabelle id verbunden ist), Tabelle Lehrer mit Spalten, id, name, vorname, geburtsdatum, titel)
Also zuerst sieht die Tabelle die ausgegeben wird so aus:
|prüfung|lehrer|schueler|
|mathe |martin|matthias|
|english|hugo|erwin|

Wenn man dann auf martin klickt wird folgende tabelle ausgegeben.
|name|vorname|titel|geburtsdatum|
Prinz|Martin|Prof.|20.04.1960|

Die id wird zum verlinken benutzt wird aber nicht ausgegeben. Also brauche ich removecolumn schon und insert column, usw. (glaube ich)

Ich muss mich ein bisschen in Qt noch einarbeiten, deswegen weiß ich jetzt nicht genau aber wenn ich die QStringlistModel verwenden würde brauche ich gar kein QAbstractTableModel sondern füge das QStringlistModel gleich meiner QTableView zu oder ? und mit QListString greife ich auf die Werte zu oder?

Verfasst: 7. Oktober 2008 22:50
von Undefined
Jede Zeile und Spalte ist ein QModelIndex.
Dabei ist es wichtig welche Editieren Strategie du gewählt hast.
Nicht übertragbares Beispiel:

Code: Alles auswählen

void HTableView::removeSelectedItemRow ()
{
  if ( currentIndex ().isValid() )
  {
    int row = currentIndex ().row();
    if ( model->index ( row, 0 ).isValid() )
    {
      if ( model->editStrategy() !=  QSqlTableModel::OnRowChange )
        model->setEditStrategy ( QSqlTableModel::OnRowChange );

      if ( ! model->removeRow ( row ) )
        errorMessageBox();
    }
  }
}
Auf daten Direkt zugreifen kannst du z.B. mit

Code: Alles auswählen

void dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )