QT-C ++ и Generic C ++ и STL [закрыто]

19

В последнее время я проверял мой C ++, Ubuntu QQ. Я люблю фреймворк Qt для всего, особенно для создания GUI. Я стал довольно знаком с ним при использовании PyQt за последние несколько лет.

При использовании PyQt у меня были некоторые проблемы, которые сейчас более выражены при использовании C ++ с Qt: Qt имеет много расширений для C ++, которые специфичны для Qt - QString является лишь одним из распространенных примеров, не говоря уже об автоматизированной сборке мусора. Можно писать приложения на Qt, используя C ++, совсем не зная о C ++ и STL.

Возможно, мне скоро придется снова выходить на рынок труда, и я хотел бы иметь возможность рассмотреть позиции C ++ - но я боюсь, что слишком сильная привязанность к Qt ограничит мои способности работать с универсальным C ++, который когда-то был довольно грозным, но сейчас долго спят и ржавые.

Должен ли я избежать Qt? Буду ли я лучше использовать WxWidgets или GTK ++ для создания GUI?

Какая структура графического интерфейса лучше всего использовать, которая позволяет / требует наибольшего использования универсального C ++ и STL? Как сделать себя наиболее привлекательным программистом на C ++, когда дело доходит до каркасов GUI и т. Д.?

Вектор
источник

Ответы:

15

Я бы не стал воздерживаться от использования Qt только по этим причинам. Вы не обязаны использовать все служебные классы Qt; для тех, которые заменяют STL, вы по большей части будете вынуждены использовать QString и, возможно, QStringList. Кроме того, в программе обычно гораздо больше, чем в графическом интерфейсе. Вы всегда можете использовать исключительно универсальный C ++ для остальной части вашей программы и использовать Qt только для GUI.

По моему мнению, работа с STL больше связана с пониманием того, какие базовые структуры данных используются и их сложности, и, следовательно, в какое время вам следует использовать каждый контейнер. И когда речь идет о программировании на C ++, особенно важно знать, как использовать очень важный заголовок <gorithm>, который также должен работать с контейнерами Qt, поскольку они STL-совместимы.

Я не вижу большого вреда в использовании всех этих расширений, предоставляемых Qt, если вы знаете (или хотя бы имеете общее представление о том), как они реализованы внутри. Убедитесь, что вы знаете, что такие вещи, как Q_OBJECT, SIGNAL (), SLOT (), foreach (), не волшебство, а макросы, которые расширяются до допустимых операторов C ++. Например, не так уж сложно понять, как реализованы неявно разделяемые классы и отношения родитель-потомок, которые делают Qt более похожим на Java. Вы всегда можете попытаться воссоздать некоторую функциональность в отдельном проекте, просто чтобы посмотреть, сможете ли вы сделать это с помощью универсального C ++, и тогда вам не будет плохо от использования их в Qt.

Также взгляните на библиотеки Boost. Они предоставляют дополнительные утилиты, которых нет в стандартной библиотеке C ++, и являются действительно хорошим способом приблизиться к универсальному C ++, поскольку они по сути следуют тем же соглашениям, что и универсальный C ++. Некоторые из библиотек имеют довольно сложные шаблонные классы, и просто попытка понять, как они работают, само по себе является хорошим изучением в C ++. У Boost есть много утилит, которые не могут быть найдены в Qt, и другие, которые реализуют те же или подобные концепции, что и некоторые классы Qt, и могут использоваться вместо них.

Если вы попадаете на рынок труда, работая с C ++, скорее всего, вы собираетесь работать с Qt или другим фреймворком, который, подобно ему, будет иметь свои собственные служебные классы, которые пытаются упростить C ++.

LLLL
источник
4
+1 за «Вы всегда можете использовать исключительно универсальный C ++ для остальной части вашей программы и использовать Qt только для GUI».
Г-н Махбубур Рахман
@MahbuburRAaman - да, это отличный совет. Используйте Qt только для графического интерфейса и того, что необходимо подключить обратно. Остальное пишите, используя Generic C ++, STL, Boost - инструменты, которые используются повсеместно.
вектор
5

Я согласен с большинством похвал Qt, но вопрос был в том, что является лучшей структурой графического интерфейса для использования, которая позволяет / требует наибольшего использования универсального C ++ и STL? В этом отношении Qt немного шизофреничен: он дублирует контейнеры и алгоритмы STL со своими особенностями. Он также предоставляет контейнеры, которые отличаются от STL. Совместимость между Qt и STL не всегда гладкая. В некоторых случаях требуется несколько вызовов функций, чтобы добраться std::stringдо QStringи обратно.

У wxWidgets есть опция для сборки STL, которая использует исключительно контейнеры STL - не существует параллельной вселенной с заменителями собственного производства, как в случае с Qt. Он также компилируется стандартным компилятором C ++, не требуя нестандартных расширений. Это качественный графический интерфейс, заслуживающий внимания.

Вы также можете взглянуть на gtkmm, который является оболочкой C ++ для GTK +. Это ближе к выполнению вашего первого требования, чем Qt.

Пол Юрчак
источник
1
«У wxWidgets есть опция для сборки STL, которая использует исключительно контейнеры STL ...» - я вижу - это ВАЖНО знать. «В некоторых случаях требуется несколько вызовов функций, чтобы перейти от std :: string к QString» - понял - я еще не исследовал это. Я немного знаком с GTK и Wx - но Qt, кажется, блестит в сравнении, по крайней мере, с моей точки зрения - C ++ НЕ мой первый язык - я пришел из мира Clipper / Delphi и затем изучил C ++, потому что мне приходилось иметь дело с Win 32s и т.д.
вектор
2

Я бы не стал слишком беспокоиться о том, чтобы не использовать определенные библиотеки STL, такие как std :: string или std :: iostream или std :: vector. QT-эквиваленты бывают разных вкусов, но они не так далеки, чтобы создавать какие-либо проблемы.

На мой взгляд, более идиоматическим отличием является стиль программирования, который тяжело использовать newдля распределения. В то время как для программы QT это может быть хорошо для части Gui, преимущество C ++ и RAII в том, что вы можете фактически хранить много данных в стеке, а не в куче. При переходе на написание кода без GUI вы должны помнить об этом.

wirrbel
источник
1
Суть, которую я пытался сделать, заключается не в том, что распределение кучи, как правило, плохо, это не самая лучшая вещь для локальных переменных. Классы GUI имеют тенденцию жить долго и лучше всего размещаться в куче, локальные переменные, которые нужны только временно, хорошо живут в стеке. в C # с Garbace Collection они скоро будут уничтожены, так что с кучей тоже все в порядке. Но с ручными new/deleteвызовами это не так просто и подвержено ошибкам. В критических разделах (обработка больших данных) это может иметь значение, особенно deleteвызовы могут быть довольно медленными.
wirrbel
1
это не проблема 10000 объектов пользовательского интерфейса, но для сложных структур данных дерева с миллионом записей и т. д., где когда-то можно было бы прибегнуть к более разумным способам распределения объектов (массовое распределение или множество умно написанных классов повышения и т. д.). Вывод: куча не плохая, ее нужно грамотно использовать. Путь Qt иногда не подходит для других вещей. Это все еще невероятный инструментарий, по моему мнению.
wirrbel
Так как насчет C ++ 11? умные указатели и т. д., кажется, облегчат многие ваши проблемы. Я только начинаю с этим связываться. Как я уже сказал, я согласен, что Qt KICKS BUTT. Мой план состоит в том, чтобы использовать Qt для графического интерфейса и делать все возможное, используя C ++ 11 - который, по-видимому, делает большую часть Boost, например, устаревшим и в значительной степени закрывает пробелы между Java / C # и старой школой C ++. У меня возникает ощущение (на данный момент, по общему признанию), что комбинация Qt и C ++ 11 может стать большим победителем.
вектор
2
Я думаю, вы поняли мою точку зрения: у вас есть много вариантов с C ++, с C ++ вы должны выбирать мудро. Умные указатели и т. Д. Также имеют проблемы. Надоело C #, вы можете взглянуть на dlang.org, который делает много вещей лучше (GCed).
wirrbel
Между тем мне нужно собрать цепочку инструментов, которая поддерживает C ++ 11. Я сейчас использую codelite - очень хорошую IDE - но из коробки (компилятор GNU) он не поддерживает 11, как я только что узнал ... Может быть, я может подключить 11 совместимый компилятор в него. Не собираюсь начинать с D, Boo и т. Д. И т. Д. - как я уже говорил, мне, возможно, придется довольно скоро снова выйти на рынок труда, и я хочу иметь основные языки для обеспечения конкурентоспособности, а не «единственные предложения». Множество рабочих мест на Python - очень жаль, что я больше не могу терпеть Python!
вектор