Table Frage

Alles rund um die Programmierung mit Qt
Antworten
Mantus
Beiträge: 19
Registriert: 6. November 2007 00:30

Table Frage

Beitrag von Mantus »

Hi ich hab in meinem Fenster 2 Table views
im hintergrund läuft ein task der alle 200ms daten abholt, und dann entscheidet in welchen der beiden tables die daten rein müssen (CAN nachrichten)

aber irgendwie bin ich noch nicht dahinter gekommen wie ich da jetzt am besten die daten zur anzeige bringe ?
kennt wer ein gutes tutorial das mir den umgang mit solchen table views näherbringt ? ich such schon länger im google, find aber nix das mir wirklich weiterhilft

PS.: Table View is doch die bessere variante für sowas oder als ein Table Widget ?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Hast du dir die Model/View-Doku in deer Doku schon mal angeschaut?
Mantus
Beiträge: 19
Registriert: 6. November 2007 00:30

Beitrag von Mantus »

die im assistenten meinst ?
klar

Hab mir auch eine model subclass erstellt, ich vermut mal in dieses model sollt mein thread seine daten reinschupfen

also ich hab mir das so vorgestellt das ich 2 models mach, für jeden Table View eins, und diese models werden vom thread befüllt, da das ganze nicht editierbar sein wird, fallen die models ja recht einfach aus.

aber irgendwie hab ich noch nicht ganz durchschaut wie ich QT dazu bekomm meine 2 models für die beiden Table Views zu verwenden, also mir fehlt ein tutorial das diesen links zwischen model und vie herstellt :/
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

Mantus
Beiträge: 19
Registriert: 6. November 2007 00:30

Beitrag von Mantus »

also jetzt hab ich ein model, das durch einen thread mit daten befüllt wird, und ich habs dem table gesetzt

aber irgendwie sind die daten zwar drin, aber der table zeigt mir nur den header an und keine daten :/

das is mein model:

Code: Alles auswählen

#include "CANMsgTableModel.h"
#include <QString>
#include <iostream>

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

CANMsgTableModel::~CANMsgTableModel()
{
}

Qt::ItemFlags CANMsgTableModel::flags(const QModelIndex& index) const
{
   return Qt::ItemIsEnabled;
}

QVariant CANMsgTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
   if ( role != Qt::DisplayRole )
      return QVariant();
   switch (section) {
      case 0:   return QString("TimeStamp");
      case 1:   return QString("Type");
      case 2:   return QString("ID");
      case 3:   return QString("length");
      case 4:   return QString("Can Msg");
      default: return  QVariant();
   }
} 

QVariant CANMsgTableModel::data(const QModelIndex& index, int role) const
{
	CANMsg cm;
	cm = CANMsgEntrys.at(index.row());
	
	if ( role != Qt::DisplayRole )
		return QVariant();
	switch (index.column()) {
      	case 0:   return QString("%1").arg(cm.timestamp);
      	case 1:   return QString("Type");
      	case 2:   return QString("ID");
      	case 3:   return QString("length");
      	case 4:   return QString("Can Msg");
      	default: return  QVariant();
	}
}

void CANMsgTableModel::insertCANMsg(CANMsg& canMsg){
	CANMsgEntrys.append(canMsg);
	std::cerr<<"\nadded";
	std::cerr<<CANMsgEntrys.at(CANMsgEntrys.size()-1).timestamp;
		
	emit dataChanged(createIndex(0,0), createIndex(CANMsgEntrys.size()-1, 1));
}
und hier wirds verbunden

Code: Alles auswählen

	canModelB = new CANMsgTableModel(this);
	ui.tableCANA->setModel(canModelA);
der thread läuft brav, und führt auch alle 100ms "insertCANMsg" aus, und im model befinden sich auch die richtigen daten ..... nur im hauptfenster seh ich nur einen leeren table, lediglich der header ist drin.
hab versucht mit

Code: Alles auswählen

	connect (canModelA,SIGNAL(dataChanged(const QModelIndex, const QModelIndex)),ui.tableCANA,SLOT(update()));
[quote]
das ganze irgendwie zu verbinden in der hoffnung das er den table neu zeichnet, aber er will einfach ned[/quote]
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

rowCount, beginInsertRows, endInsertRows... ?
Mantus
Beiträge: 19
Registriert: 6. November 2007 00:30

Beitrag von Mantus »

Code: Alles auswählen

#ifndef CANMSGTABLEMODEL_H_
#define CANMSGTABLEMODEL_H_
#include <QAbstractTableModel>
#include <QVariant>
#include <QModelIndex>
#include <Qt>
#include "CANMsg.h"


class CANMsgTableModel : public QAbstractTableModel {
	
	QList<CANMsg> CANMsgEntrys; 
	
public:
	CANMsgTableModel(QObject* parent = 0);
	virtual ~CANMsgTableModel();
	

	QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
	QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; 
	
	int rowCount(const QModelIndex& idx = QModelIndex())const {      return CANMsgEntrys.size();}
	int columnCount(const QModelIndex& idx = QModelIndex())const {   return 5;}
	Qt::ItemFlags flags(const QModelIndex& index) const; 	
	
	void insertCANMsg(CANMsg& canMsg);
};

#endif /*CANMSGTABLEMODEL_H_*/
werden im header deffiniert.

und laut QTAssistent toturial brauch ich diese insert sache nicht wenn ich ein reines read only model basteln will ?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

da kann nicht mehr viel fehlen.. aber:

Code: Alles auswählen

canModelB = new CANMsgTableModel(this);
ui.tableCANA->setModel(canModelA); 
ne.. da wird noch gar nichts verbunden... alles was ich sehe ist, dass das Model B (!!) erzeugt wird und das Model A (!) auf die View gesetzt wird.. wenn ModelA NULL ist, geht da gar nichts...

Code: Alles auswählen

connect (canModelA,SIGNAL(dataChanged(const QModelIndex, const QModelIndex)),ui.tableCANA,SLOT(update())); 
erstens unnoetig... und zweitens geht das nicht weil die Prototypen der beiden Funktionen dataChanged und update unterschiedlich sind..

kann zwar nicht die Ursache fuer dein Problem sein, aber

Code: Alles auswählen

 int rowCount(const QModelIndex& idx = QModelIndex())const {      return CANMsgEntrys.size();} 
im Header ist nicht huebsch... bei jedem Include wird da ne neue Funktion erzeugt (entweder ausprogrammiert in der cc-File oder als inline)

was ist da noch.. ach ja: fuegst du neue Meldungen via (threadsichere) Signals/Slots ein? Ich frage nur weil QList nicht threadsafe ist...
Antworten