Взаимозаменяемо использовать std::string и QString

#c #string #qt #stl #qstring

#c #строка #qt #stl #qstring

Вопрос:

Я широко использую Qt в программной системе, над которой я работаю, для графических компонентов и GUI. Однако для большинства внутренних алгоритмов и обработки данных Qt играет меньшую роль.

Я часто сталкиваюсь с необходимостью преобразования из std:: string в QString или наоборот. Я склоняюсь к тому, чтобы использовать std:: string как можно чаще и использовать QString только тогда, когда мне нужно передавать строки в классы Qt, подобные тем, которые работают с файловой системой.

Когда я программировал этим утром, меня осенило, что, возможно, плохой дизайн — разбросать std:: string и QString по всему моему коду. Должен ли я полностью переключиться на QString? Кто-нибудь еще сталкивался с этим выбором дизайна?

Qt предоставляет во многом те же функциональные возможности, что и STL, но я все еще не решаюсь полностью переключаться, поскольку Qt менее стандартизирован и стабилен.

Ответ №1:

Да, у меня уже была такая ситуация раньше. Программа, над которой я работал, повсюду использовала Qt, но мне пришлось подключить ее к библиотеке, которая ожидала std::string . Преимущество QString заключается в том, что он явно использует Unicode, в то время как стандартная библиотека C не дает никаких гарантий в отношении кодирования.

Решение состояло в том, чтобы преобразовать на границе этой библиотеки с

 QString toQString(std::string const amp;s)
{
    return QString::fromUtf8(s.c_str());
}

std::string fromQString(QString const amp;s)
{
    return std::string(s.toUtf8().data());
}
  

поскольку созданная библиотека std::string содержит UTF-8.

Кажется, вы хотите прямо противоположного: использовать std::string повсюду и конвертировать на границе Qt. Это кажется совершенно нормальным; это требует немного больше работы, чем постоянное использование QString , но вам все равно придется приложить усилия, когда вам понадобится не QString принимающая библиотека, а ваши компоненты, отличные от GUI, не зависят от Qt (ура!).

Комментарии:

1. QString имеет метод toStdString() . Смотрите здесь: doc.trolltech.com/4.5/qstring.html#toStdString . Для создания QString из std::string вы можете использовать этот конструктор: doc.trolltech.com/4.5/qstring.html#QString-7

2. @yasourer: да, но они зависят от глобально установленной кодировки символов. Эти функции поступают из библиотеки, которая была получена std::string из другой библиотеки, всегда содержащей UTF-8.

3. Вы можете улучшить работу этих функций, даже если строки содержат встроенные значения NUL, также передавая длину — return QString::fromUtf8(s.c_str(), s.size()) и auto buf = s.toUtf8(); return std::string(buf.data(), buf.size()); .

Ответ №2:

Я бы сказал, используйте std::string в вашем программном ядре и преобразуйте их в QString , когда вы работаете над частью GUI. Если вы когда-нибудь захотите изменить свой инструментарий GUI, это будет проще.