Table Frage
Table Frage
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 ?
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 ?
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 :/
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 :/
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:
und hier wirds verbunden
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
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));
}
Code: Alles auswählen
canModelB = new CANMsgTableModel(this);
ui.tableCANA->setModel(canModelA);
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]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_*/
und laut QTAssistent toturial brauch ich diese insert sache nicht wenn ich ein reines read only model basteln will ?
da kann nicht mehr viel fehlen.. aber:
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...
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
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...
Code: Alles auswählen
canModelB = new CANMsgTableModel(this);
ui.tableCANA->setModel(canModelA);
Code: Alles auswählen
connect (canModelA,SIGNAL(dataChanged(const QModelIndex, const QModelIndex)),ui.tableCANA,SLOT(update()));
kann zwar nicht die Ursache fuer dein Problem sein, aber
Code: Alles auswählen
int rowCount(const QModelIndex& idx = QModelIndex())const { return CANMsgEntrys.size();}
was ist da noch.. ach ja: fuegst du neue Meldungen via (threadsichere) Signals/Slots ein? Ich frage nur weil QList nicht threadsafe ist...