2013-02-06 40 views
12

Tôi hiện đang làm việc trên một dự án lớn hơn, nơi "logic" được thực hiện trong tiêu chuẩn C++ với tất cả các chuỗi được xử lý với std::wstring và phần UI được thực hiện bằng cách sử dụng Qt và do đó nhất thiết phải là QString (Câu hỏi thưởng: điều này có đúng không?).Cách tốt nhất để chuyển đổi std :: wstring thành QString

Cách tốt nhất để kết nối hai thế giới đó là gì?

Tôi biết tôi có thể sử dụng một cái gì đó giống như

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

nhưng tôi tự hỏi nếu có một cách đẹp hơn với ít gõ liên quan. Một toán tử do người dùng định nghĩa xuất hiện trong đầu tôi, nhưng tôi không đủ kinh nghiệm để tự mình giải quyết nó.

Sẽ rất vui nếu có ai đó chỉ cho tôi đúng hướng.

+4

Bạn đã bao giờ đọc [QString, std :: wstring và built-in wchar_t] (http://qt-project.org/wiki/toStdWStringAndBuiltInWchar) chưa? –

+0

Bạn đã chấp nhận câu trả lời chỉ mô tả chuyển đổi theo một hướng. Đó có phải là câu hỏi của bạn? Sau đó, bạn có lẽ nên sửa đổi các tiêu đề để nó không phải là gây hiểu lầm (đối với những người hy vọng sẽ tìm thấy một câu trả lời về việc chuyển đổi theo hướng khác). –

Trả lời

14

Bạn nên sử dụng QString::fromStdWStringnhưng (!!!) nếu Qt được biên dịch với chính xác các tiêu đề STL giống như dự án của bạn. Nếu không - bạn có thể nhận được rất nhiều niềm vui, bắt lỗi.

Nếu bạn không chắc chắn rằng cả hai tiêu đề STL đều giống nhau sử dụng QString::fromWCharArray:

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

Cập nhật: trả lời để @juzzlin:
Hãy tưởng tượng rằng Qt được xây dựng với STL chứa sau 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; 
    ... 
}; 

và bạn có STL chứa sau std::wstring:

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

Nếu bạn sẽ cung cấp cho bạn std::wstring để Qt, nó sẽ giải thích m_the_end con trỏ như độ dài của chuỗi, và

bạn có thể nhận được rất nhiều niềm vui, bắt một lỗi

+1

Điều gì sẽ xảy ra nếu "chính xác" cùng một tiêu đề STL không được sử dụng? Và tại sao QString :: fromWCharArray() một giải pháp tốt hơn là trường hợp đó? – juzzlin

+1

từStdWString được gạch chân trong qstring.h và đã thực hiện: 'return fromWCharArray (s.data(), int (s.size()));' Vì vậy, nó là an toàn để sử dụng nó. – rmflow

+0

@rmflow Vâng, bạn nói đúng, nhưng không có gì đảm bảo rằng 'wstring :: data' và' wstring :: size' cũng được inlined. – borisbn

0

có thể làm cho một hàm inline QString toQString(std::wstring string) để làm cho nó 'ít hơn để gõ' ...

nhưng phải trung thực ... thats không phải là nỗ lực lớn ở tất cả để viết nó bất cứ lúc nào;)

soo dài zai

2

tôi nghĩ rằng một người dùng được xác định chuyển đổi là những gì bạn đang tìm kiếm, và từ những gì tôi có thể thu thập, nó sẽ giống như thế này:

class foo 
{ 
public: 
    operator QString(std::wstring& ws) 
    { 
     return QString::fromStdWString(ws); 
    } 
} 
Các vấn đề liên quan