Seite 1 von 1

Windows / Linux: Font- und Icongröße, Datei öffnen Probleme

Verfasst: 23. Januar 2007 10:15
von darmstadt
Hallo zusammen,

Wenn ich meine Anwendung (die ich unter Windows entwickle) unter Linux kompiliere habe ich drei Probleme:

1) Die font in QLabel von QDialogen und in QToolbar (und wahrscheinlich auch überall) haben unterschiedliche Größe je nachdem ob ich die Anwendung unter Windows unter Linux oder über einen X-Server starte. Weiterhin sind die QIcon in meinem QToolbar unter Linux kleiner.

2) Unter Linux sind Minimize-, Maximize-, Closemöglichkeiten meiner QMainwindow nicht vorhanden.

3) Unter Linux frage ich nach einem Dateiname mit Hilfe von QFileDialog und öffne sie anschließend mit fopen.

Code: Alles auswählen

...
#include <stdio.h>
...
QString fileName = QFileDialog::getOpenFileName(this);
FILE pFile = fopen (this->getUrl().toLatin1().constData(),"rb");
...
Sehr eigenartig ist, dass es manchmal einwandfrei funktioniert und aber, dass ich manchmal einen segmentation fault kriege.

Ich weiss nicht weiter, könnte mir jemand aufklären?

viele Grüße

Verfasst: 23. Januar 2007 10:17
von darmstadt
oups..

natürlich muss es im Code heissen:

Code: Alles auswählen

#include <stdio.h>
...
QString fileName = QFileDialog::getOpenFileName(this);
...
data->setUrl(fielName);
...
FILE pFile = fopen (data->getUrl().toLatin1().constData(),"rb"); 
Entschuldigung.

Verfasst: 23. Januar 2007 10:49
von Christian81
Warum fopen() und nicht QFile()?

FILE pFile = fopen (data->getUrl().toLatin1().constData(),"rb");

nach dieser Zeile ist der übergebene Dateiname ungültig da das zugehörige Objekt wieder zerstört wurde... ggf. liegt es daran. Oder es sind Sonderzeichen im Dateinamen - Du handelst das nicht korrekt.

Wie gesagt - QFile ist wesentlich besser

Verfasst: 23. Januar 2007 11:29
von darmstadt
Danke Christian81 für deine schnelle Antwort.

Was meinst du genau mit viel besser? pFile hat sich über sehr lange Zeit gewährt. Für meine Anwendung ist es wichtig auf sehr große Datei sehr oft zu zugreifen. Dabei ist es wichtig, dass das einlesen so rasch wie möglich passiert. Ich weiss, dass pFile die Anforderungen sehr gut erfüllt.

Ich würde sehr gern pFile weiter benutzen. Gibt es eine Lösung?

danke

Verfasst: 23. Januar 2007 11:34
von Christian81
Ich sehe zwar immer noch absolut keinen Grund warum unbedingt fopen() hier benutzt werden muss, aber hast du schonmal versucht errno auszulesen?

Verfasst: 23. Januar 2007 11:36
von darmstadt
ist QFile genau so schnell wie pFile?

Verfasst: 23. Januar 2007 11:38
von darmstadt
wenn ja sehe ich auch keinen Grund warum ich QFile nicht nutzen sollte -> ich werde QFIle ausprobieren. Weiss du vielleicht einen Antwort auf eine anderen Fragen?

Verfasst: 23. Januar 2007 11:39
von Christian81
Wieso sollte es nicht??
Abgesehen davon solltest Du Dir die Doku von QFile mal anschauen... http://doc.trolltech.com/4.2/qfile.html#handle

Verfasst: 23. Januar 2007 11:43
von Christian81
Für 1) - indirekt. Es konnte am verwendeten Stylesheet liegen. Ausserdem ist es nicht gut wenn man im ui-File z.B. feste Fontgrössen einträgt, das gibt auch nur Ärger
Für 2) Imho kommt das auf den Windowmanager an - je nachdem ob er es erlaubt oder nicht. Schau auch mal die WFlags an -> http://doc.trolltech.com/4.2/qt.html#WindowType-enum

Verfasst: 23. Januar 2007 16:58
von darmstadt
ok, ich habe meine Klassen auf QFile umgestellt. Die dateien die ich einlesen muss sind binary unformated mit Fortran geschrieben worden. Ich habe z.B. diesen code geschrieben um den INT 4 Bytes lang an der Stelle 20 Bytes einzulesen:

Code: Alles auswählen

    //Datei öffnen
    QFile file(this->url);
    if (!file.open(QIODevice::ReadOnly)){
        return 0;
    }
    QDataStream in(&file);

    //Offset setzen
    bool pos = file.seek(Q_UINT64_C(20));

    //Lesen
    quint32 nk;
    in >> nk;
allerdings ist der wert von nk falsch!!

ich komme nicht weiter. Weisst ihr vielleicht was das problem sein könnte?

vielen Dank

Verfasst: 23. Januar 2007 17:28
von Christian81
Was nützt es Dir in QFile einen Seek von 20 zu machen und dann nicht von QFile sondern vom QDataStream zu lesen? Das sollte man schon QDataStream::skipRawData im QDataStream benutzen.

Verfasst: 24. Januar 2007 15:46
von darmstadt
Stimmt, hätte ich auch machen können.

Das Problem konnte ich mit dem COde loesen:

Code: Alles auswählen

in.setByteOrder(QDataStream::LittleEndian);
Danke trotzdem