Saubere Möglichkeit, QString in char * umzuwandeln (nicht const char * !!!!)

7

Ich habe einen hässlichen Code für dieses Zeug (erstelle einen c char-Zeiger und kopiere den QString darin), aber vielleicht ... existiere in QT auf elegante Weise ...

tatsächlicher Code:

%Vor%

nur zur Information Ich brauche ein REAL char * nicht ein einfaches const char *, damit dieser Code nicht funktioniert:

%Vor%

Ich kann Ссылка

nicht verwenden     
Gilles Grandguillaume 29.07.2013, 23:53
quelle

7 Antworten

26

Das ist einfach:

%Vor%

Sie können auch toLatin1 oder toUtf8 anstelle von toLocal8Bit verwenden. Beachten Sie, dass keiner von ihnen mit data call in die Warteschlange gestellt werden kann. Und toStdString().c_str() ist ebenfalls ungültig. Das liegt daran, dass jede QByteArray oder std::string , die auf diese Weise erzeugt wird, temporär ist und sofort zerstört wird, wenn char puffer damit zerstört wird. Sie müssen QByteArray in einer lokalen Variablen speichern, während Sie den Puffer verwenden.

Beachten Sie auch, dass Qt QByteArray class bereitstellt, um mit char-Arrays umgehen zu können. Im Allgemeinen ist es nicht notwendig, char* zu verwenden, mit QByteArray können Sie fast alles machen.

    
Pavel Strakhov 30.07.2013, 11:11
quelle
1

Ich denke, die Lösung hängt vom Typ der zu konvertierenden Zeichen ab, und ob eine C-Stil-Funktion mit Argumenten vom Typ "char *" integriert / aufgerufen werden muss.

  1. Wenn eine C-Style-Funktion integriert / aufgerufen werden muss, verwenden Sie nicht toStdString () gefolgt von c_str (), da der Rückgabewerttyp "const char *" ist, was für eine C-Style-Funktion nicht geeignet ist.
  2. Verwenden Sie toLatin1 () gefolgt von data () für ASCII-Zeichen.
  3. Verwenden Sie toLocal8Bit () oder toUtf8 () gefolgt von data () für andere UTF8-Zeichen als ASCII-Zeichen.

Wenn mehrere Lösungen für Ihren speziellen Fall verwendet werden können, können ihre Effizienzniveaus leicht unterschiedlich sein, was ich nicht getestet habe.

Das folgende Testprogramm zeigt, wie diese Lösungen verwendet werden:

%Vor%

Der obige Code wurde mit Qt 5.4 für Linux getestet.

Ein zweites Thema, das in diese Frage involviert ist, ist, ob wir während dieses zweistufigen Umwandlungsprozesses Funktionen miteinander verketten können:

<myQString>.to<AnotherClass>().<getCPointer>(); // OK or not?

Ich denke, das hängt von "AnotherClass" und von der Art der zu konvertierenden Zeichen ab. Aufgrund einiger Dokumentation zu QString, QByteArray und std :: string scheint es sicher zu sein:

<myQString>.toStdString().c_str(); // OK.

<myQString>.toUtf8().data(); // Should be OK as QString is Unicode string.

Aber die folgenden Zeilen sollten vermieden werden:

<myQString>.toLocal8Bit().data(); // May crash if the converted QByteArray object is undefined !

<myQString>.toLatin1().data(); // May crash if the converted QByteArray object is undefined !

    
jonathanzh 03.07.2015 00:35
quelle
0

QString :: toLatin1 (). data () gibt Ihnen ein const char *, weil es Ihnen seinen internen Puffer gibt. Der Grund dafür ist, dass Sie es nicht ändern sollen.

Wenn Sie es also ändern wollen, müssen Sie diese Daten in einen anderen Puffer kopieren ... wie den, den Sie gerade mit new () zugewiesen haben.

    
inetknght 30.07.2013 00:10
quelle
0
%Vor%     
Yakk 30.07.2013 00:32
quelle
0

QByteArray enthält eine nicht konstante Version von data() . Sehen: Ссылка

    
fjardon 30.07.2013 10:16
quelle
0

Ich benutze das immer in meinem Code

%Vor%     
Jacob Ramey 09.07.2016 18:41
quelle
-1

Manchmal gibt es einfach keine Möglichkeit, Ihren Code in Topform zu halten. Komm damit klar. Sie könnten es in eine kleine Hilfsfunktion einbinden, QString in Parameter übernehmen und char * zurückgeben, wenn Sie wirklich wollen.

    
Xirdus 30.07.2013 00:03
quelle

Tags und Links