QSortFilterProxyModel Spalten vertauschen

Alles rund um die Programmierung mit Qt
Antworten
Andy
Beiträge: 16
Registriert: 16. Juni 2007 00:39

QSortFilterProxyModel Spalten vertauschen

Beitrag 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?
Andy
Beiträge: 16
Registriert: 16. Juni 2007 00:39

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich denke, daß du mit dem selben Model nicht gleichzeitig Filtern und Tauschen kannst. Versuch es mal mit 2 Modellen.
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag 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.
Andy
Beiträge: 16
Registriert: 16. Juni 2007 00:39

Beitrag 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!!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Oder du schreibst dir selbst schnell ein kleines ProxyModel, das von QAbstractItemModel abgeleitet ist. Alle Funktionen brauchst du ja nicht.
Andy
Beiträge: 16
Registriert: 16. Juni 2007 00:39

Beitrag 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
Antworten