Qt 5: const char * QString cast
In Qt-4 ist es möglich, automatisch warf einen QString zu einem "const char *", z.B. konnte ich-pass ein QString auf eine Funktion, die erwartet, dass ein "const char *".
void myFunction(const char *parameter);
QString myString;
myFunction(myString); //works in QT4
In Qt-5 würde ich allerdings ein "error C2440: 'type cast' : cannot convert from 'QString' in 'const char *'" (das ist die Visual C++ 2008 compiler, der andere Compiler werfen würde etwas ähnliches). Verstehe ich die Dokumentation richtig, es ist, weil die Qt 3 compatibility layer nicht mehr mit einbezogen in QT5.
Natürlich, ich könnte ändern Sie den Funktionsaufruf von
myFunction(myString);
zu
myFunction(myString.toLatin1().data());
Allerdings habe ich eine riesige Codebasis, die kompiliert einwandfrei mit Qt 4 und ich würde gerne meinen alten code kompiliert mit Qt 5 ohne es zu ändern. Gibt es eine Möglichkeit, dies zu erreichen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie ein makro oder eine inline-Funktion für Ihre Zwecke zu minimieren, werden die änderungen, aber da würde auch ein grep gleichermaßen Betrieb, es ist nicht viel Unterschied.
oder
dann:
ABER
natürlich, in einer idealen Welt wäre es schön, wenn Ihr "myFunction" bekommen könnte eine überlastung zu erwarten, ein
QString
argument.und dann die überlast umgesetzt würde wie diese:
natürlich würde dies erfordern, den Konstruktor als explizit, so dass keine implizite Konvertierung kann passieren, da sonst der compiler beschwert sich über Mehrdeutigkeit in Anwesenheit der beiden, wenn Sie versuchen zu übergeben
const char*
, aber wenn man immer QString benutzen, es sollte nur die Arbeit mit Qt 5.Dies ist etwas gleich umschreiben der ursprünglichen Funktion zu einer anderen Signatur erwartet
QString
obwohl da leider der entsprechende Konstruktor nicht explicit. Ich kann mir vorstellen, dass die nicht geändert wurde in Qt 5 für die Kompatibilität als wäre es gebrochen haben zu viel code.Wie Sie sehen können, Sie brauchen nicht, etwas zu ändern in Ihrem code auf diese Weise, anders als das hinzufügen einer one-liner zu überlasten. Es ist nett, nicht wahr?
Können Sie entweder
MyFunction( const QString & parameter )
(natürlich, das funktioniert nur, wenn Sie nicht brauchen, die eine, diechar *
mehr)Überlastung
MyFunction
:Wenn die oben ist unmöglich, für einige Grund, der beste Ansatz ist wahrscheinlich zu schreiben, die eine ähnliche wrapper:
Ist es nicht mehr möglich zu werfen
QString
zuconst char*
im >= Qt 5, weilQString
istUTF-16
und hat nicht mehr einen Eintrag für die Zwischenspeicherung das Ergebnis der Umwandlung zu ASCII.Dem Weg zum erreichen Ihrer Ziel
a) Fügen Sie überladungen der Funktionen erwartet
const char*
die mitQString
s,b) Fügen Sie die explizite Konvertierung-code den Aufruf der Website, oder
c) Gehe zu einem
char
-basierte Zeichenfolge, wiestd::string
.Keiner von denen erfüllen, die Ihr Ziel fast keine änderungen, obwohl.
Ich fand diese auf der QT-forum
Dieser mein Problem gelöst