Seite 1 von 1

seltsame Reaktion von QSqlTableModel wenn SQLite[workaround]

Verfasst: 26. November 2010 16:04
von Troll.Soft
Hallo,
ich benutze QSqlTableModel, habe eine eigene Klasse davon abgeleitet und benutze diese. Unter mySql alles ok. Unter SQLite alles ok, wenn weniger als 256 Records. Ab 256 Records liefert das TableModel für jede Spalte nur noch QVariant::Invalid zurück. Setze ich das darunterliegende Query mit seek auf einen Wert > 256 und hole per value(..) Daten, erhalte ich immer noch die erwarteten Werte.
Wie bringe ich das Modell auch unter SQLite zum Laufen?

Code: Alles auswählen

bool myQSqlTableModel::select	( QString Select )
{
	bool RetVal = Query.exec(Select);

	QSqlTableModel::setQuery(Query);

	RowCount		= Query.size();

	if ( SQLITE )
		if ( Query.first() )	{
			RowCount = 1;
			while ( Query.next() )
				RowCount++;
			}

int Key = 4711;
Key = QSqlTableModel::data(index(255, 0), Qt::DisplayRole ).toInt();	//	liefert den erwarteten Wert
Key = QSqlTableModel::data(index(256, 0), Qt::DisplayRole ).toInt();	//	liefert QVariant::Invalid 
Query.seek(256);
Key = Query.value(0).toInt();	//	liefert den erwarteten Wert

	return RetVal;
}
bin für jeden Tip dankbar
tschüß
Troll.Soft

Verfasst: 26. November 2010 18:00
von Troll.Soft

Code: Alles auswählen

Key = QSqlTableModel::data(index(256, 0), Qt::DisplayRole ).toInt();   //   liefert QVariant::Invalid
in dieser Zeile wird schon ein invalider Model Index zurückgeliefert. Row und Col im ModelIndex stehen auf -1. Der rowCount() des Models liefert aber den richtigen Wert
Rätselhaft ?????

Verfasst: 26. November 2010 18:07
von dazedly
Existieren überhaupt 257 Einträge?

Verfasst: 26. November 2010 20:36
von Troll.Soft
dazedly hat geschrieben:Existieren überhaupt 257 Einträge?
Setze ich das darunterliegende Query mit seek auf einen Wert > 256 und hole per value(..) Daten, erhalte ich immer noch die erwarteten Werte.

Verfasst: 28. November 2010 20:12
von Troll.Soft
moin auch,
das muss ein Bug in Qt sein.
Habe eine Weile rumprobiert und folgenden Workaround entwickelt.

Code: Alles auswählen

PseudoCode
void myClass::workAround()
{
	if ( SQLITE )	{
		for ( int I = 0; I <= model()->rowCount() / 256; I++ )
			tableView()->scrollToBottom();
		tableView()->scrollToTop();
		}
}
Würde gerne Eure Meinungen hierzu hören.

Also ich habe ein TableModel und zwei Views. Ein TableView und ein RecordView. Benutze mal mySql mal SQLite. Unter mySql ist immer alles ok. Unter SQLite und dem TableView ist auch immer alles ok. Benutze ich aber SQLite und RecordView stehen nur in den ersten 256 Rows Daten. Die restlichen Rows existieren offenbar, denn model()->rowCount() liefert den korrekten Wert. Zugriffe liefern nur QVariant::invalid. Ein beherzter tableView()->scrollToBottom() und weitere 256 also 512 Rows sind im Zugriff. Wohlgemerkt nur bei SQLite, bei mySql ist alles in Butter.

Meiner Meinung nach ein Bug.

tschüß
Troll.Soft