Qt - смешивание типов Qt и std :: C ++ - PullRequest
7 голосов
/ 06 ноября 2011

Более привычный и практический вопрос, но считается ли он плохой формой или крайне нецелесообразным (выберите вашу интерпретацию плохости), чтобы смешивать использование типов библиотеки Qt и аналогичных стандартных типов C ++ в одной программе?

Например, настоятельно рекомендуется использовать ТОЛЬКО QStrings для использования строк или люди часто смешивают типы QString и std :: string в исходном файле?

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

Ответы [ 5 ]

7 голосов
/ 06 ноября 2011

Я думаю, что на самом деле все сводится к тому, что «это зависит от того, что вы делаете». Конечно, проще хранить вещи как один тип.Тем не менее, могут быть случаи, когда вам нужно передать std :: strings или передать QStrings, и может быть лучше с точки зрения производительности не выполнять преобразование.

Также следует помнить, что QStrings не совпадают с std: строки.Так что имейте это в виду при конвертации между ними (или при выборе использования только определенного типа).

5 голосов
/ 06 ноября 2011

Отметьте это сообщение в блоге , которое сравнивает STL с QTL и std::string с QString.

Мои 2 цента

Это действительно зависит от того, что вы делаете.В общем, когда я кодирую что-то, где Qt не требуется (например, библиотека), я всегда использую STL.С другой стороны, если я пишу код для приложения с графическим интерфейсом, я предпочитаю использовать QTL и QString вместо STL и std::string.Если я хочу интегрировать этот код с библиотекой, написанной с использованием STL, я предоставляю перегруженные функции, которые выполняют преобразование из STL в QTL и QString в std::string.

QStrings является обязательным условием Если вы хотите локализовать ваше приложение, так как использование tr() и QLinguist упрощает его работу.

3 голосов
/ 06 ноября 2011

Строки QStrings и C ++ решают различные проблемы - главное отличие состоит в том, что QStrings явно работают с локалями / кодировками, а std :: strings - нет.

, поэтому используйте QStrings для всех данных, введенных пользователями, и всех строк, которые будут отображаться для ваших пользователей, или вы рискуете потерять информацию при преобразовании кодировки и / или усложнить интернационализацию вашего приложения вбудущее.

Для всего, где мне нужен только символ *, например, для хранения данных, считанных из базы данных, где локали / кодировки не применимы, я использую std :: strings, так как их намного проще использовать сбиблиотеки не-Qt, и ваши данные не проходят через какие-либо преобразования кодировки.Однако вы должны явно добавить их в систему типов qt, чтобы иметь возможность использовать их в аргументах сигнал / слот, что легко сделать, если вы знаете, как.

Но, в конце концов, это вызов суждения -просто для того, чтобы сделать вашу кодовую базу более доступной для новичков, может быть лучше просто везде использовать QString или, возможно, просто везде использовать std :: string, если вы используете QtCore в не-графическом приложении.

3 голосов
/ 06 ноября 2011

В общем, я предпочитаю использовать контейнеры QString над std::string и Qt (например, QList, ...) над std в коде, который в любом случае тесно связан с каркасом Qt имеет смысл без этого. Во всех других компонентах (например, вспомогательных библиотеках и т. П.) Я предпочитаю использовать стандартный подход C ++ для большей гибкости.

Но я думаю, что это скорее субъективное решение, поскольку типы обычно довольно легко конвертировать друг в друга (и контейнеры Qt также предоставляют стандартные согласующие итераторы). Хотя в сильно Qt-ориентированном коде контейнеры Qt могут работать лучше, особенно вместе с мета-объектом и системой типов Qt.

1 голос
/ 06 ноября 2011

Полагаю, решать вам.В любом случае, учтите, что для преобразования между ними требуется копия строки, поэтому, если для использования обоих требуется преобразование, это не очень хорошо с точки зрения производительности: например, прочитайте QString :: fromStdString и QString:: fromStdWString .Если вы используете Qt, я думаю, вы можете использовать не только QString, и в этом случае большинство методов классов Qt требуют, чтобы вы предоставили QString.Таким образом, это может сказаться на производительности и неудобно писать.

Примите также во внимание, что std :: string незначительно отличается от реализации к реализации, а std :: string copy-on-write может показывать разную производительность.

...