2013-02-06 19 views
12

मैं वर्तमान में एक बड़ी परियोजना पर काम कर रहा हूं, जहां मानक तर्क + + में "तर्क" लागू किया गया है, जिसमें std::wstring के साथ सभी तारों को संभाला जा रहा है और UI भाग Qt का उपयोग करके लागू किया गया है और इस प्रकार जरूरी QString (बोनस प्रश्न: क्या यह सच है?)।std :: wstring से QString को परिवर्तित करने का सबसे अच्छा तरीका

उन दो दुनिया को जोड़ने का सबसे अच्छा तरीका क्या है?

मैं जानता हूँ कि मैं की तरह

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

कुछ का उपयोग कर सकते हैं, लेकिन अगर वहाँ कम शामिल टाइपिंग के साथ एक अच्छे तरीका है मैं सोच रहा हूँ। एक उपयोगकर्ता परिभाषित ऑपरेटर मेरे दिमाग में आया, लेकिन मुझे अपने आप से निपटने के लिए पर्याप्त अनुभव नहीं हुआ है।

कोई खुशी होगी अगर कोई मुझे सही दिशा में इंगित कर सकता है।

+4

क्या आपने कभी [QString, std :: wstring और अंतर्निहित wchar_t] पढ़ा है (http://qt-project.org/wiki/toStdWStringAndBuiltInWchar)? –

+0

आपने एक उत्तर स्वीकार कर लिया है जिसमें केवल एक दिशा में रूपांतरण का वर्णन किया गया है। क्या यह आपका सवाल था? तो आपको शायद शीर्षक को संशोधित करना चाहिए ताकि यह भ्रामक न हो (उन लोगों के लिए जो दूसरे दिशा में रूपांतरण के बारे में उत्तर ढूंढने की उम्मीद कर रहे हैं)। –

उत्तर

14

QString::fromStdWStringलेकिन (!!!) का उपयोग करना एक अच्छा विचार है यदि क्यूटी को आपके प्रोजेक्ट के समान एसटीएल हेडर के साथ संकलित किया गया था। यदि नहीं - तो आप एक बग पकड़कर बहुत मज़ा ले सकते हैं।

यदि आप सुनिश्चित नहीं है कि दोनों एसटीएल हेडर ही उपयोग QString::fromWCharArray हैं करते हैं:

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

अद्यतन: @juzzlin को जवाब दे:
कल्पना करो कि क्यूटी निम्नलिखित युक्त एसटीएल के साथ निर्माण किया गया था चलें 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; 
    ... 
}; 

और आप युक्त एसटीएल निम्नलिखित std::wstring है:

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

आप स्ट्रिंग की लंबाई के रूप में अपने std::wstring क्यूटी के लिए, यह व्याख्या करेगा m_the_end सूचक दे ​​देंगे, तो और

आप बहुत मज़ा मिल सकता है, एक बग

पकड़ने
+1

क्या होगा यदि "बिल्कुल वही" एसटीएल हेडर का उपयोग नहीं किया जाता है? और क्यूस्ट्रिंग :: सेWCharArray() एक बेहतर समाधान क्यों है? – juzzlin

+1

से एसटीडब्लूस्ट्रिंग qstring.h में रेखांकित है और कार्यान्वयन है: 'WCharArray (s.data(), int (s.size()) से वापस लौटें;' इसलिए, इसका उपयोग सुरक्षित है। – rmflow

+0

@rmflow हाँ, आप सही हैं, लेकिन इस बात की कोई गारंटी नहीं है कि 'wstring :: data' और' wstring :: size' भी रेखांकित हैं। – borisbn

0

शायद एक इनलाइन समारोह QString toQString(std::wstring string) यह कम टाइप करने के लिए 'बनाने के लिए ...

लेकिन ईमानदारी से ... यह समय-समय पर लिखने के लिए बड़ा प्रयास बिल्कुल नहीं thats बनाने;)

सू लंबे zai

2

मुझे लगता है कि एक उपयोगकर्ता परिभाषित रूपांतरण के लिए आप क्या देख रहे हैं है, और से मैं क्या इकट्ठा कर सकते हैं, यह कुछ इस तरह दिखना चाहिए:

class foo 
{ 
public: 
    operator QString(std::wstring& ws) 
    { 
     return QString::fromStdWString(ws); 
    } 
} 
संबंधित मुद्दे