Alles rund um die Programmierung mit Qt
xcvbm
Beiträge: 4 Registriert: 19. April 2007 11:16
Wohnort: Bremen
Beitrag
von xcvbm » 7. Dezember 2007 12:04
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!
Zuletzt geändert von
xcvbm am 10. Dezember 2007 14:21, insgesamt 1-mal geändert.
upsala
Beiträge: 3946 Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:
Beitrag
von upsala » 7. Dezember 2007 12:18
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.
xcvbm
Beiträge: 4 Registriert: 19. April 2007 11:16
Wohnort: Bremen
Beitrag
von xcvbm » 10. Dezember 2007 10:20
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));
}
upsala
Beiträge: 3946 Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:
Beitrag
von upsala » 10. Dezember 2007 12:22
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
xcvbm
Beiträge: 4 Registriert: 19. April 2007 11:16
Wohnort: Bremen
Beitrag
von xcvbm » 10. Dezember 2007 12:52
Ahh. Danke für den Tip, manchmal wird man blind. Werde mich melden wenn es neues gibt.
Gruß
xcvbm
xcvbm
Beiträge: 4 Registriert: 19. April 2007 11:16
Wohnort: Bremen
Beitrag
von xcvbm » 10. Dezember 2007 14:21
Danke, der Tip war entscheidend!
Mein VC6 Compiler merkt aber nix davon (der is ja auch alt).
Gruß & Danke
xcvbm