В настоящее время я работаю над большим проектом, где «логика» реализована в стандарте C ++ со всеми строками, обрабатываемыми с std::wstring
и часть пользовательского интерфейса реализована с использованием Qt и, следовательно, обязательно QString
(Бонусный вопрос: это правда?).
Как лучше всего соединить эти два мира?
Я знаю, что могу использовать что-то вроде
std::wstring wideString;
QString qtString = QString::fromStdWString(wideString);
но мне интересно, есть ли лучший способ с меньшим количеством ввода. Мне пришел в голову пользовательский оператор, но я не достаточно опытен, чтобы справиться с этим самостоятельно.
Был бы рад, если бы кто-нибудь мог указать мне правильное направление.
Это хорошая идея для использования QString::fromStdWString
но (!!!) если Qt был скомпилирован с теми же заголовками STL, что и ваш проект. Если нет — вы можете получить массу удовольствия, поймав ошибку.
Если вы не уверены, что оба заголовка STL используются одинаково QString::fromWCharArray
:
std::wstring wideString;
QString qtString = QString::fromWCharArray( wideString.c_str() );
Обновить: отвечая на @juzzlin:
Давайте представим, что Qt был собран с STL, содержащим следующее 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;
...
};
и у вас есть STL, содержащий следующее std::wstring
:
class wstring {
wchar_t * m_ptr;
wchar_t * m_the_end;
...
};
Если вы дадите std::wstring
Qt будет интерпретировать m_the_end
указатель как длина строки, и
Вы можете получить массу удовольствия, поймав ошибку
Я думаю, что пользовательское преобразование — это то, что вы ищете, и из того, что я могу собрать, оно должно выглядеть примерно так:
class foo
{
public:
operator QString(std::wstring& ws)
{
return QString::fromStdWString(ws);
}
}
возможно сделать встроенную функцию QString toQString(std::wstring string)
чтобы было меньше печатать …
но, честно говоря … это совсем не большое усилие, чтобы время от времени писать это;)
так долго, зай