2013-02-06 12 views
12

Ich arbeite derzeit an einem größeren Projekt, wo die "Logik" in Standard-C++ mit allen Strings umgesetzt wird mit std::wstring und der UI-Teil wird mit Qt und damit implementiert unbedingt QString (Bonusfrage: ist das wahr?).Beste Methode, um std :: wstring in QString zu konvertieren

Was ist der beste Weg, diese beiden Welten zu verbinden?

Ich weiß, dass ich so etwas wie

std::wstring wideString; 
QString qtString = QString::fromStdWString(wideString); 

verwenden kann, aber ich frage mich, ob es eine schönere Art und Weise mit weniger Tipp beteiligt ist. Ein benutzerdefinierter Operator kam mir in den Sinn, aber ich bin nicht erfahren genug, um das alleine anzugehen.

Würde mich freuen, wenn mir jemand in die richtige Richtung zeigen könnte.

+4

Haben Sie jemals [QString, std :: wstring und integrierte wchar_t] (http://qt-project.org/wiki/toStdWStringAndBuiltInWchar) gelesen? –

+0

Sie haben eine Antwort akzeptiert, die nur die Konvertierung in eine Richtung beschreibt. War das deine Frage? Dann sollten Sie den Titel wahrscheinlich so ändern, dass er nicht irreführend ist (für diejenigen, die hoffen, eine Antwort auf die Konvertierung in die andere Richtung zu finden). –

Antwort

14

Es ist eine gute Idee, QString::fromStdWString, aber (!!!) zu verwenden, wenn Qt mit genau den gleichen STL-Headern wie Ihr Projekt kompiliert wurde. Wenn nicht - Sie können eine Menge Spaß haben, einen Fehler zu fangen.

Wenn Sie nicht sicher tun, dass beide STL-Header sind die gleichen Verwendung QString::fromWCharArray:

std::wstring wideString; 
QString qtString = QString::fromWCharArray(wideString.c_str()); 

Update: Beantwortung @juzzlin:
Lässt sich vorstellen, dass Qt mit der STL bauen wurde mit folgenden std::wstring:

class wstring { // I know, that there's no such class, but I'm shure you'll understand what I want to say 
    wchar_t * m_ptr; 
    size_t m_length; 
    ... 
}; 

und Sie haben die STL folgende std::wstring enthält:

class wstring { 
    wchar_t * m_ptr; 
    wchar_t * m_the_end; 
    ... 
}; 

Wenn Sie Ihr std::wstring zu Qt geben werde, wird es m_the_end Zeiger als die Länge der Zeichenfolge interpretieren und

Sie viel Spaß bekommen können, einen Fehler zu kontrollieren

+1

Was würde passieren, wenn "genau die gleichen" STL-Header nicht verwendet werden? Und warum ist QString :: fromWCharArray() eine bessere Lösung? – juzzlin

+1

fromStdWString ist in qstring.h inline und hat die Implementierung: 'return fromWCharArray (s.data(), int (s.size()));' So ist es sicher, es zu verwenden. – rmflow

+0

@rmflow Ja, Sie haben recht, aber es gibt keine Garantie, dass 'wstring :: data' und' wstring :: size' ebenfalls inline sind. – borisbn

0

vielleicht eine Inline-Funktion machen QString toQString(std::wstring string) zu machen, ‚weniger geben‘ ...

aber um ehrlich zu sein ... das ist nicht die große Mühe überhaupt es von Zeit zu Zeit zu schreiben;)

soo lange zai

2

ich denke, eine benutzerdefinierte Konvertierung ist das, was Sie suchen, und von dem, was ich sammeln kann, sollte es in etwa so aussehen:

class foo 
{ 
public: 
    operator QString(std::wstring& ws) 
    { 
     return QString::fromStdWString(ws); 
    } 
} 
Verwandte Themen