Dateinamen mit '%20' machen Probleme

Alles rund um die Programmierung mit Qt
Antworten
shinji
Beiträge: 23
Registriert: 28. Juli 2010 19:01

Dateinamen mit '%20' machen Probleme

Beitrag von shinji »

Hallo!

Ich habe ein blödes Problem. Folgendes möchte/habe ich realisiert:

a) Dateien über ein Auswahlfenster auswählen.
b) Die Dateinamen in einem QTableWidget anzeigen lassen.
c) Den Inhalt des Widgets löschen lassen

Funktioniert bisher auch super. Außer dann, wenn die Dateinamen anstatt eines Spaces ein '%20' enthalten. Dies bestrifft eigentlich nur Dateien, die man sich aus dem Internet heruntergeladen hat.

Folgendes kann ich beobachten:

Nach der Auswahl der Dateien liegen die Pfade inkl. Namen in einer QStringList mit dem Namen 'files'. Schon dort scheint es die ersten Veränderungen zu geben.

Folgende Dateinamen verwende ich:

Code: Alles auswählen

[001]video1 mit ton.mp4
[002]Video2 ohne Ton Inhalt:Dies und Das.mp4
[003]AAA%20 BBB%20 CCC DDD & EEE FFF%20 [20100316].wmv
[004]XXX YYY - ABCDEFG HHH.avi
[005]xxxyyy 123456%20 aaa vvvvv & wwww ssss%20 s.wmv
[006]%20%20Test.wmv
Die '%20' bei [003] und [005] sieht man nicht. Die '%20' bei [006] habe ich menuell hinzugefügt. Diese werden also auch so angezeigt. Ich glaube, da wird ein %2520 draus gemacht.

Eine Testdatei heißt bei mir "[006]%20%20Test.wmv". Gebe ich den Namen aber aus, wir daraus ein "[006]%20 Test.wmv". Die Ausgabe erfolgt über ein QLabel:

Code: Alles auswählen

QString tmp;
QFile file(currentDir.absoluteFilePath(files[i]));
tmp = QString(QFileInfo(file).baseName());
QLabel *label = new QLabel(tmp);
label->show();
Auf die selbe Art fülle ich mein QTableWidgetItem. Die schon im QLabel verstümmelten Namen werden aber erst garnicht angezeigt!

Code: Alles auswählen

QTableWidget *filesTable;
...
QFile file(currentDir.absoluteFilePath(files[i]));
qint64 size = QFileInfo(file).size();
QTableWidgetItem *fileNameItem = new QTableWidgetItem(QString("%1").arg(QFileInfo(file).baseName()));
int row = filesTable->rowCount();
filesTable->insertRow(row);
filesTable->setItem(row, 0, fileNameItem);
...

Dann versuche ich die Einträge in der Tabelle zu löschen. Statt 6 habe ich also nur 3 Dateien in der Tabelle. Das Löschen erfolgt über:

Code: Alles auswählen

QTableWidget *filesTable;
...
for (int i=0; i < filesTable->rowCount(); ++i)
{
    filesTable->removeRow(i);
}
filesList.clear();
filesTable->update();
...
Das "lustige" ist jetzt, in fileList ist zwar kein Eintrag mehr drin, in der Tabelle wird aber noch genau 1 Eintrag angezeigt und lässt sich auch durch wiederholtes removeRow() nicht entfernen.

Ich raff das gerade nicht so ganz. Wo liegt denn da der Fehler?

Gruß
Thorsten
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Beitrag von sanni »

Versuche es doch mal wenn du den Leerzeichen ein Backslash voranstellst. Wie verhält sich die Anzeige dann?
20 ist doch das Leerzeichen im ascii. Da könnte es sein, dass du es mit verschiedenen Ländercodes zu tun hast.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Was die "%20" betrifft: Das schimpft sich URL-Encoding. Schau hier, wenn dich Standards interessieren.

Dein Problem mit den nicht verschwindenden Reihen ist ein logisches:

Code: Alles auswählen

for (int i=0; i < filesTable->rowCount(); ++i)
{
    filesTable->removeRow(i);
}
Mal dir Stück für Stück auf einen Zettel auf, was passiert, ich mach mal den Anfang:

Code: Alles auswählen

Data (Index : "Label"):
0 : "0"
1 : "1"
2 : "2"
3 : "3"
4 : "4"
5 : "5"

i=0 -> removeRow(0):
Data:
0 : "1"
1 : "2"
2 : "3"
3 : "4"
4 : "5"

i=1 -> removeRow(1):
Data:
0 : "1"
1 : "3"
2 : "4"
3 : "5"
Ich hoffe du siehst, wohin das läuft :P

Was spricht eigentlich gegen "filesTable->clear()"? Dein eigentliches Problem hab ich aber nicht so recht verstanden.
shinji
Beiträge: 23
Registriert: 28. Juli 2010 19:01

Beitrag von shinji »

Ah, ok.... wusste nicht das removeRow() die anderen Zeilen nachrücken lässt. :)

Aber ein fileTable->clear() habe ich deswegen nicht verwendet, weil dieses auch meine ganzen Formatierungen, also Kopfzeile, Farben usw. entfernt. Jetzt nehme ich aber ein clearContents(). ;)

Mein ursprüngliches Problem.... hmmmm... ich mach am besten mal Screenshots.

Das folgende Bild zeigt die Dateien so, wie ich die unter KDE4.4.5 im Dolphin sehe:

Dateien im Dolphin

Die rot unterstrichenen Stellen bestehen aus zwei Leerzeichen, wobei eines davon eigentlich ein '%20' ist. Bei der letzten Datei habe ich einfach einmal den String '%20%20' manuell als Dateiname vergeben. Das sieht man so also auch im Dolphin.

Lade ich diese Dateien in eine QStringList und gebe den Inhalt über ein QLabel aus, sehen die Namen schon so aus:

Dateien als QLabel

Wie man sieht fehlt hier das '%20', welches vorher aber sichtbar war! Die vorher unsichtbaren '%20' werden plötzlich angezeigt (siehe [003]).

In meiner Tabelle sieht das dann so aus:

Dateien im MainWindow

Wie zu sehen ist fehlen hier alle Dateien, die ein %20 enthalten haben!
Die Angabe in der Statuszeile bezieht sich auf den Inhalt der QStringList. Diese enthält also 6 Einträge.

Wo liegt der Fehler?
Lese ich die Dateien schon falsch ein?
Oder liegt der Fehler beim Befüllen der TableWidgets?
Für einen Fehler beim Einlesen bzw. der weiteren Verarbeitung spricht ja, dass bereits im QLabel die Dateinamen nicht mehr richtig angezeigt werden. Habe über so ein Problem aber bisher nichts finden können :(

Gruß
Thorsten
Antworten