Seite 1 von 1

QSortFilterProxyModel Spalten vertauschen

Verfasst: 20. August 2007 18:25
von Andy
Hi!

Ich habe mir zum besseren Verständnis von Qt und der Model-View Architektur ein kleines Wörterbuchprogramm geschrieben das bis auf eine Kleinigkeit auch funktioniert:

Also ich habe ein Model das mir eine Tabelle mit folgendem Format zurückliefert:

deutsch, englisch, französisch, spanisch

Das Anzeigen, Ändern und Einfügen direkt am Modell funktioniert einwandfrei.

Das Programm soll folgende Sichten ermöglichen:

deutsch->englisch
deutsch->französisch
deutsch->spanisch
englisch->deutsch
französisch->deutsch
spanisch->deutsch

Um die verschiedenen Sichten zu filtern habe ich QSOrtFilterProxyModel abgeleitet.

Um die jerweils anderen Sprachen auszublenden habe ich filterAcceptsColumn() überschrieben - wass auch funktioniert

Jetzt muss ich nurnoch je nach Sprachkombination die Spalten tauschen,
was ich über mapFromSource() und mapToSource() machen wollte.
Leider bekomme ich dann in der View nichts mehr angezeigt, außer die Spalten werden nicht neu gemapt.

Der Code sieht wie folgt aus:

Code: Alles auswählen

QModelIndex dictFilterSortProxy::mapFromSource(const QModelIndex& sourceIndex)const{
	QModelIndex indexA=sourceIndex;
//	if(langComb==deEng || langComb==deFr || langComb==deSpan)
//		return sourceIndex;
	 if(langComb==engDe){
		if(sourceIndex.column()==0)
			indexA= index(sourceIndex.row(), 1);
		else if(sourceIndex.column()==1)
			indexA= index(sourceIndex.row(), 0);
	}
	else if(langComb==frDe){
		if(sourceIndex.column()==0)
			indexA= index(sourceIndex.row(), 2);
		else if(sourceIndex.column()==2)
			indexA= index(sourceIndex.row(), 0);
	}
	else if(langComb==spanDe){
		if(sourceIndex.column()==0)
			indexA= index(sourceIndex.row(), 3);
		else if(sourceIndex.column()==3)
			indexA= index(sourceIndex.row(), 0);
	}
return indexA;
}

QModelIndex dictFilterSortProxy::mapToSource ( const QModelIndex & proxyIndex ) const{
	QModelIndex indexA=proxyIndex;
//	if(langComb==deEng || langComb==deFr || langComb==deSpan)
//		return proxyIndex;
	else if(langComb==engDe){
		if(proxyIndex.column()==0)
			indexA= index(proxyIndex.row(), 1);
		else if(proxyIndex.column()==1)
			indexA= index(proxyIndex.row(), 0);
	}
	else if(langComb==frDe){
		if(proxyIndex.column()==0)
			indexA= index(proxyIndex.row(), 2);
		else if(proxyIndex.column()==2)
			indexA= index(proxyIndex.row(), 0);
	}
	else if(langComb==spanDe){
		if(proxyIndex.column()==0)
			indexA= index(proxyIndex.row(), 3);
		else if(proxyIndex.column()==3)
			indexA= index(proxyIndex.row(), 0);
	}
	return indexA;
}
Oder kann ich die Methoden dafür nicht benutzen?

Verfasst: 21. August 2007 17:28
von Andy
Da ich bis jetzt noch keine Antwort bekommen habe und ich mir eigendlich nicht vorstellen kann das mein Problem nicht zu lösen ist, gehe ich mal davon aus das ich mich oben
zu unklar ausgedrückt habe :roll:

Also vereinfacht ausgedrückt würde ich gerne wissen ob ich 2 Spalten eines QAbstractTableModels
über ein QSOrtFilterProxyModel vertauschen kann.

Verfasst: 21. August 2007 20:14
von upsala
Ich denke, daß du mit dem selben Model nicht gleichzeitig Filtern und Tauschen kannst. Versuch es mal mit 2 Modellen.

Verfasst: 22. August 2007 10:31
von NoobSaibot
soweit ich weiß werden die funktionen mapFrom und mapTo Source nicht für sowas verwendet. da werden einfach die gefilterten indizes auf nicht gefilterte indizes des quell models gemappt. die funktionen werden dir also nichts bringen bei deinem vorhaben.

Verfasst: 22. August 2007 14:52
von Andy
NoobSaibot hat geschrieben:soweit ich weiß werden die funktionen mapFrom und mapTo Source nicht für sowas verwendet. da werden einfach die gefilterten indizes auf nicht gefilterte indizes des quell models gemappt. die funktionen werden dir also nichts bringen bei deinem vorhaben.
Nachdem ich den Tipp mit den 2 Proxy's getestet hatte und das leider auch nicht geklappt hat habe ich mir sowas schon fast gedacht.
Dann muss ich halt direkt das Model anpassen.

trotzdem danke!!

Verfasst: 22. August 2007 17:31
von upsala
Oder du schreibst dir selbst schnell ein kleines ProxyModel, das von QAbstractItemModel abgeleitet ist. Alle Funktionen brauchst du ja nicht.

Verfasst: 23. August 2007 21:58
von Andy
upsala hat geschrieben:Oder du schreibst dir selbst schnell ein kleines ProxyModel, das von QAbstractItemModel abgeleitet ist. Alle Funktionen brauchst du ja nicht.
Ich habe jetzt einfach alles im Model untergebracht.
Den Aufwand noch einen Proxy zu implementieren hätte sich für die kleine Übung nicht gelohnt.

Das war so schon genug Arbeit als QtNoob :D