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 verwendenDas 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.
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.
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 !
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.