Saubere Art und Weise zu konvertieren QString nach char * (nicht const char* !!!!)
Habe ich einen hässlichen code für dieses Zeug (erstellen Sie ein c-char-Zeiger und kopieren Sie den QString in es), aber vielleicht ... existieren in QT eine elegante Art und Weise ...
tatsächlichen code :
QString maquina is a method parameter.
char *c_maquina = new char[maquina.length() + 1];
strcpy(c_maquina, maquina.toStdString().c_str());
nur für Informationen, die ich brauche einem ECHTEN char* nicht eine einfache const char*, so dass dieser code nicht funktioniert :
idMaquina.toLatin1().data();
Kann ich nicht verwenden http://developer.qt.nokia.com/faq/answer/how_can_i_convert_a_qstring_to_char_and_vice_versa
- "Ich kann kein link" - warum ist die Verbindung nicht nutzbar ist? Sie muss klarer sein. Erklären Sie nicht nur das problem mit Ihrem direkten plan (erhalten einen
char*
aus einerQString
), aber was führte Sie zu denken, Sie brauchte das. - Yakk, kann ich nicht verwenden, konvertieren Sie erklären, wie Sie in den link, da es sich um eine Konvertierung zwischen einem QString und ein char* (ohne Möglichkeit zum überschreiben char*).ich brauche ein char* mit posible überschreiben, hoffe ich, dass ein QString-Funktion für diese... thx für dein Kommentar.
- Ich weiß immer noch nicht, warum Sie nicht verwenden die verlinkten Lösung. Das problem ist, dass der Beispielcode verwendet
const char*
und nichtchar*
?.data()
gibt einechar*
. Außerdem, was wollen Sie tun, mit der beschreibbarechar*
? - da mein code Aufruf einer c-Bibliothek und die Antwort ist leer, wenn die Verwendung einer const char* oder, wenn Sie verwenden ein .Daten() direkt, wie das Beispiel von dem link.ich kann nicht ändern Sie den code der library c (im inneren des Systems des Kunden....)
- und was hat der C-Bibliothek mit der
char*
? Einfach "immer einechar*
" nicht die Antwort auf Ihre problem. Hoffen Sie, dass die Daten aus der C-Funktion? Gibt es keine Möglichkeit zu wissen, wie lange die Daten, die er geben wollte, die Sie ist? Bitte geben Sie die Signatur der Funktion, die Sie versuchen zu nennen. - sorry Yakk ich nicht sehr klar war meine Frage in Wirklichkeit war es nur ein problem der lokalen Variablen ... sorry für deine Zeit.
- mögliche Duplikate von Umwandlung von QString nach char*
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist einfach:
Können Sie auch
toLatin1
odertoUtf8
statttoLocal8Bit
. Beachten Sie, dass keiner von Ihnen in der Warteschlange mitdata
nennen. UndtoStdString().c_str()
ist auch ungültig. Dies liegt daran, dass jederQByteArray
oderstd::string
produziert, so ist temporär und werden sofort zerstört, zerstören char Puffer mit ihm. Sie brauchen, um zu speichernQByteArray
in eine lokale variable, während Sie mit der Puffer.Beachten Sie auch, dass Qt bietet
QByteArray
Klasse zum Umgang mit char-arrays. In der Regel gibt es keine Notwendigkeit zu verwendenchar*
, Sie können tun fast alles, was mitQByteArray
.Ich glaube, die Lösung hängt von der Art der Zeichen, die konvertiert werden, und ob ein C-style-Funktion mit "char *" Typ-Argumente werden muss eingebunden/aufgerufen.
Wenn mehrere Lösungen können verwendet werden, für Ihren spezifischen Fall, Ihre Effizienz möglicherweise etwas anders, die habe ich noch nicht getestet.
Das folgende Testprogramm zeigt, wie Sie diese Lösungen:
Der obige code ist getestet mit Qt 5.4 für Linux.
Einem zweiten Fach an dieser Frage ist, ob wir-chain-Funktionen zusammen, in dieser 2-Schritt-Konvertierung:
<myQString>.to<AnotherClass>().<getCPointer>(); //OK or not?
Ich denke, das hängt davon ab, "AnotherClass" und auf die Art der Zeichen, die konvertiert werden. Basierend auf eine Dokumentation QString, QByteArray und std::string, es scheint, dass es ist sicher zu schreiben:
<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().Daten() gibt dir einen const char*, weil es Ihnen Ihre internen Puffer. Der Grund ist es const ist, weil Sie sind eigentlich nicht zu ändern.
Also, wenn Sie wollen, um es zu ändern, müssen Sie kopieren die Daten an einige andere Puffer... wie, dass man Sie nur reserviert mit new().
std::vector<char>
? Das ist eine seltsame Art und Weise zu sagenstd::string
.string
ist eine Folge vonchar
mit Bedeutung (über die char-Eigenschaften). Einvector<char>
ist ein Puffer vonchar
große Stücke mit keinen eingebauten Bedeutung. Der op wollte ein Puffer, soweit ich das sehen konnte.QByteArray enthält eine nicht const version von
data()
. Siehe:http://qt-project.org/doc/qt-5.0/qtcore/qbytearray.html#data
Ich diese in meinem code die ganze Zeit
Manchmal, es gibt einfach keine Möglichkeit zu halten Sie Ihren code auf top-Schönheit. Deal with it. Vielleicht wickeln Sie es in eine kleine Hilfsfunktion, wobei QString in parameter-und Rückgabe char*, wenn Sie wirklich wollen.