2013-02-06 12 views
12

Obecnie pracuję nad większym projektem, w którym "logika" jest zaimplementowana w standardowym C++ z wszystkimi ciągami obsługiwanymi z std::wstring, a część interfejsu jest zaimplementowana za pomocą Qt i tym samym koniecznie QString (Pytanie dodatkowe: czy to prawda?).Najlepszy sposób na konwersję std :: wstring do QString

Jaki jest najlepszy sposób połączenia tych dwóch światów?

wiem, że mogę użyć czegoś jak

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

ale zastanawiam się, czy jest ładniejszy sposób mniej pisania zaangażowanego. Przypomniał mi się operator zdefiniowany przez użytkownika, ale nie mam wystarczająco dużo doświadczenia, aby poradzić sobie z tym samodzielnie.

Byłoby miło, gdyby ktoś mógł wskazać mi właściwy kierunek.

+4

Czy kiedykolwiek czytałeś [QString, std :: wstring i wbudowane wchar_t] (http://qt-project.org/wiki/toStdWStringAndBuiltInWchar)? –

+0

Zaakceptowano odpowiedź, która opisuje tylko konwersję w jednym kierunku. Czy to było twoje pytanie? Prawdopodobnie powinieneś zmodyfikować tytuł tak, aby nie był mylący (dla tych, którzy mają nadzieję znaleźć odpowiedź na temat konwersji w innym kierunku). –

Odpowiedz

14

Dobrym pomysłem jest użycie QString::fromStdWString, ale (!!!), jeśli Qt został skompilowany z dokładnie tymi samymi nagłówkami STL co Twój projekt. Jeśli nie, możesz się dobrze bawić, łapiąc błąd.

Jeśli nie pewny, że oba nagłówki STL są takie same zastosowanie QString::fromWCharArray:

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

Aktualizacja: odpowiadając na @juzzlin:
Pozwala wyobrazić, że Qt został utworzony z STL zawierającą następujące 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; 
    ... 
}; 

i masz STL zawierającą następujące std::wstring:

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

Jeśli dasz swój std::wstring do Qt, będzie interpretować jako wskaźnik m_the_end długości łańcucha, a

można dostać dużo zabawy, łowienie błąd

+1

Co by się stało, gdyby nie były używane "dokładnie takie same" nagłówki STL? Dlaczego QString :: fromWCharArray() jest lepszym rozwiązaniem? – juzzlin

+1

fromStdWString jest inline w qstring.h i ma implementację: 'return fromWCharArray (s.data(), int (s.size()));' Więc, jest bezpieczny w użyciu. – rmflow

+0

@rmflow Tak, masz rację, ale nie ma gwarancji, że 'wstring :: data' i' wstring :: size' są również wstawione. – borisbn

0

może utworzyć funkcję inline QString toQString(std::wstring string) aby to „mniej wpisać” ...

ale szczerze mówiąc ... nie Ów wielki wysiłek w ogóle pisać je od czasu do czasu;)

soo długo zai

2

myślę konwersja zdefiniowane przez użytkownika jest to, czego szukasz, a od tego, co można zbierać, powinno to wyglądać mniej więcej tak:

class foo 
{ 
public: 
    operator QString(std::wstring& ws) 
    { 
     return QString::fromStdWString(ws); 
    } 
} 
Powiązane problemy