[gelöst] QTableView hat immer eine QCheckBox

Alles rund um die Programmierung mit Qt
Antworten
xcvbm
Beiträge: 4
Registriert: 19. April 2007 11:16
Wohnort: Bremen

[gelöst] QTableView hat immer eine QCheckBox

Beitrag von xcvbm »

Moin!

Mein erstes Posting, schönen guten Tag. :D

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:

Code: Alles auswählen

return Qt::ItemIsEnabled;
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 »

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 »

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 »

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 »

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 »

Danke, der Tip war entscheidend!

Code: Alles auswählen

	if (role != Qt::DisplayRole)
		return  QVariant();
Mein VC6 Compiler merkt aber nix davon (der is ja auch alt).

Gruß & Danke
xcvbm
Antworten