Seite 1 von 1
[gelöst] QTableView hat immer eine QCheckBox
Verfasst: 7. Dezember 2007 12:04
von xcvbm
Moin!
Mein erstes Posting, schönen guten Tag.
Wie sich dem Titel entnehmen lässt habe ich ein QTableView, und leider auch in jedem Feld eine QCheckBox. Ich experimentiere schon seit ein paar Tagen mit dem MVC Konzept und dachte das löst sich mit der Zeit, aber alles was ich zu dem Problem gefunden habe sind Möglichkeiten die QCheckBox mithilfe der
Code: Alles auswählen
Qt::ItemFlags QAbstractTableModel::flags(const QModelIndex& index)
hineinzubekommen. Mein flags sagt immer nur:
Und trotzdem hat jedes Item eine CheckBox?
Gruß und Dank im Voraus!
Verfasst: 7. Dezember 2007 12:18
von upsala
Ich bin mir jetzt nicht sicher, aber es könnte sein, daß wenn man bei der Qt::CheckStateRole was anderes als QVariant() zurückliefert, ebenfalls eine CheckBox erhält. Ansonsten wäre mal der Code des gesamten Models interessant.
Verfasst: 10. Dezember 2007 10:20
von xcvbm
So, hier mehr vom Code... Leider konnte ich nicht ganz nachvollziehen wer die Qt::CheckStateRole zurückgibt?
LogEntryModel.h
Code: Alles auswählen
class LogEntryModel : public QAbstractTableModel
{
QList<LogEntry*> logEntries;
public:
LogEntryModel(QObject* parent = 0);
virtual ~LogEntryModel();
void clear();
void loadFile(const QString&);
void addEntry(LogEntry* v){ logEntries.append(v);}
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 logEntries.size();}
int columnCount(const QModelIndex& idx = QModelIndex())const { return 2;}
Qt::ItemFlags flags(const QModelIndex& index) const;
};
LogEntryModel.cpp
Code: Alles auswählen
LogEntryModel::LogEntryModel(QObject* parent)
: QAbstractTableModel(parent)
{
}
LogEntryModel::~LogEntryModel()
{
clear();
}
void LogEntryModel::clear()
{
while(!logEntries.isEmpty())
delete logEntries.takeLast();
}
Qt::ItemFlags LogEntryModel::flags(const QModelIndex& index) const
{
return Qt::ItemIsEnabled;
}
QVariant LogEntryModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if ( role != Qt::DisplayRole )
return QVariant();
return QString("%1").arg((section==0)?"Zeit":"Eintrag");
}
QVariant LogEntryModel::data(const QModelIndex& index, int role) const
{
LogEntry* lE = logEntries.at(index.row());
switch (index.column()) {
case 0: return lE->getTime().toString("HH:mm:ss:zzz");
case 1: return lE->getLogText();
default: return QVariant();
}
}
void LogEntryModel::loadFile(const QString& fileName)
{
QFile logFile(fileName);
QByteArray log;
if (!logFile.open(QIODevice::ReadWrite))
return;
log = logFile.readAll();
logFile.close();
// Inhalt verarbeiten
char *ptr = log.data();
int sz = log.size();
char* end = ptr+sz;
*end=0;
for(;ptr<end;){
char *eol = strchr(ptr,'\n');
if(eol)
*eol=0;
char *eol2 = strchr(ptr,'\r');
if(eol2)
*eol2=0;
//06:22:34:562_:
//
int hour,min,sec,ms;
int c = sscanf(ptr,"%d:%d:%d:%d",
&hour,&min,&sec,&ms
);
if (c == 4) {
QTime time(hour, min, sec, ms);
addEntry(new LogEntry(time, QString(ptr+14)));
}
if(!eol)
break;
ptr=eol+1;
}
emit dataChanged(createIndex(0,0), createIndex(logEntries.size()-1, 1));
}
Verfasst: 10. Dezember 2007 12:22
von upsala
Code: Alles auswählen
QVariant LogEntryModel::data(const QModelIndex& index, int role) const
{
LogEntry* lE = logEntries.at(index.row());
switch (index.column()) {
case 0: return lE->getTime().toString("HH:mm:ss:zzz");
case 1: return lE->getLogText();
default: return QVariant();
}
}
Du beachtest die role nicht. Das sollte im übrigen der Compiler auch als Warning ausgeben. Schau dir in den Examples mal an, wie die Modelle die role innerhalb der data-Funktion behandeln.
Item-Roles
Verfasst: 10. Dezember 2007 12:52
von xcvbm
Ahh. Danke für den Tip, manchmal wird man blind. Werde mich melden wenn es neues gibt.
Gruß
xcvbm
Verfasst: 10. Dezember 2007 14:21
von xcvbm
Danke, der Tip war entscheidend!
Mein VC6 Compiler merkt aber nix davon (der is ja auch alt).
Gruß & Danke
xcvbm