#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-72. @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, это будет проще.