2013-02-06 16 views
12

Attualmente sto lavorando su un progetto più grande, dove la "logica" è implementata in C++ standard con tutte le stringhe gestite con std::wstring e la parte UI è implementata usando Qt e quindi necessariamente QString (domanda bonus: è vero?).Il modo migliore per convertire std :: wstring in QString

Qual è il modo migliore per collegare questi due mondi?

So che posso usare qualcosa di simile

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

ma mi chiedo se c'è un modo migliore con meno di battitura coinvolti. Mi è venuto in mente un operatore definito dall'utente, ma non ho esperienza sufficiente per affrontarlo da solo.

Sarebbe felice se qualcuno potesse indicarmi la giusta direzione.

+4

Hai mai letto [QString, std: wstring e wchar_t incorporato] (http://qt-project.org/wiki/toStdWStringAndBuiltInWchar)? –

+0

Hai accettato una risposta che descrive solo la conversione in una direzione. Era questa la tua domanda? Quindi dovresti probabilmente modificare il titolo in modo che non sia fuorviante (per coloro che sperano di trovare una risposta sulla conversione nella direzione opposta). –

risposta

14

È una buona idea usare QString::fromStdWStringma (!!!) se Qt è stato compilato con esattamente le stesse intestazioni STL del progetto. Altrimenti, puoi divertirti un sacco, prendendoti un insetto.

Se non lo fai in modo che sia le intestazioni STL sono lo stesso uso QString::fromWCharArray:

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

Aggiornamento: rispondere alle @juzzlin:
lascia immaginare che Qt è stato costruito con l'STL contenente le seguenti 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; 
    ... 
}; 

e avete la STL contenente le seguenti std::wstring:

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

Se darai il tuo m_the_end puntatore std::wstring per Qt, che interpreterà come la lunghezza della stringa, e

è possibile ottenere un sacco di divertimento, la cattura di un bug

+1

Cosa succederebbe se le intestazioni STL "esattamente uguali" non venissero utilizzate? E perché QString :: fromWCharArray() una soluzione migliore è quel caso? – juzzlin

+1

fromStdWString è inline in qstring.h e ha implementazione: 'return fromWCharArray (s.data(), int (s.size()));' Quindi, è sicuro utilizzarlo. – rmflow

+0

@rmflow Sì, hai ragione, ma non è garantito che 'wstring :: data' e' wstring :: size' siano anch'essi in linea. – borisbn

0

magari fare una funzione inline QString toQString(std::wstring string) per renderlo 'meno per digitare' ...

ma ad essere onesti ... non questo è il grande sforzo a tutti di scrivere di tanto in tanto;)

soo lungo zai

2

credo che un utente di conversione definito è quello che stai cercando, e da quello che ho potuto capire, dovrebbe essere simile a questa:

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