Использование как std :: string, так и QString взаимозаменяемо - PullRequest
9 голосов
/ 26 мая 2011

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 26 мая 2011

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

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

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

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

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

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

6 голосов
/ 26 мая 2011

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

...