QT-C ++ проти загальних C ++ та STL [закрито]


19

Нещодавно почав працювати з моїм C ++, на Ubuntu QQ. Мені подобається рамка Qt для всього, особливо для побудови графічного інтерфейсу. Я досить добре ознайомився з ним під час використання 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. Крім того, програми зазвичай набагато більше, ніж GUI. Ви завжди можете використовувати виключно загальний C ++ для решти програми, а Qt використовувати лише для GUI.

На мою думку, робота зі STL - це більше для розуміння того, які основні структури даних використовуються та їх складності, а отже, у який час слід використовувати кожен контейнер. Що ж стосується програмування на C ++, то мова йде особливо про те, як використовувати найважливіший заголовок <алгоритм>, який також повинен працювати над контейнерами Qt, оскільки вони сумісні зі STL.

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

Також погляньте на бібліотеки Boost. Вони надають додаткові утиліти, яких не має стандартна бібліотека C ++, і є дійсно хорошим способом наблизитись до загальної C ++, оскільки вони, по суті, дотримуються тих же умов, що і загальна C ++. Деякі бібліотеки мають досить складні шаблонні класи, і просто намагаючись зрозуміти, як вони працюють, саме по собі є хорошим вивченням на C ++. Boost має багато утиліт, які не можна знайти в Qt, та інші, які реалізують ті ж або подібні поняття, що і деякі класи Qt і можуть бути використані замість них.

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


4
+1 для "Ви завжди можете використовувати виключно загальний C ++ для іншої програми, а Qt використовувати лише для GUI."
Md Mahbubur Rahman

@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 32-х років тощо
вектор

2

Я б не переживав над тим, щоб не використовувати конкретні бібліотеки STL, такі як std :: string або std :: iostream або std :: vector. Еквіваленти QT мають різний аромат, але вони не так далеко, щоб створити будь-які проблеми.

На мою думку, більш ідіоматичною різницею є стиль програмування, який використовується newдля розподілу. У той час як для програми QT це може бути добре для частини Gui, чеснотою C ++ і RAII є те, що ви можете фактично зберігати багато даних у стеку замість купи. При переході на написання не-GUI-коду слід пам’ятати про це.


1
Суть, яку я намагався зробити, полягає не в тому, що розподіл купи взагалі поганий, це просто не найкраще для локальних змінних. Класи GUI, як правило, живуть довго і найкраще виділяються на купі, локальні змінні, які лише тимчасово потрібні, живуть добре на стеку. в C # з колекцією Garbace вони незабаром будуть знищені, тому купа також гаразд. Але з ручними new/deleteдзвінками це не так просто і схильні до помилок. У критичних розділах (обробка великих даних) це може змінитися, особливо deleteдзвінки можуть бути досить повільними.
wirrbel

1
це не проблема 10000 об’єктів інтерфейсу, але для складної структури даних з деревом з мільйон записів і т.д., де колись можна було б вдатися до більш розумних способів розподілу речей (масове виділення або багато розумно написаних прискорених класів і т.д.). Висновок: купа непогана, її треба розумно використовувати. Спосіб Qt іноді не розширює масштаби інших матеріалів. На мою думку, це все ще казковий інструментарій.
wirrbel

То як щодо C ++ 11? розумні покажчики тощо, мабуть, полегшать багато ваших проблем. Я зараз починаю возитися з цим. Як я вже сказав, я погоджуюся, що Qt БЕЗКОШТОВНО. Мій план полягає в тому, щоб використовувати Qt для графічного інтерфейсу та робити все, що я можу, використовуючи C ++ 11 - що, здається, робить значну частину Boost, наприклад, застарілою та значною мірою закриває прогалини між Java / C # та старою школою C ++. У мене виникає відчуття (на даний момент здалеку), що комбінація Qt та C ++ 11 може стати великим переможцем.
Вектор

2
Думаю, ви зрозуміли: у вас є багато варіантів з C ++, з c ++ ви повинні вибрати розумно. Розумні покажчики тощо також мають проблеми. Поповнившись C #, ви можете подивитися на dlang.org, який робить багато речей краще (GCed).
wirrbel

Тим часом я повинен скласти ланцюжок інструментів, що підтримує C ++ 11. Я зараз використовую коделіт - дуже хороший IDE - але поза коробкою (компілятор GNU) він не підтримує 11, як я щойно дізнався ... Можливо, я можна підключити до нього компілятор, що відповідає 11 стандартам. Не збираюся починати з D або Bo і т. Д. І т. Д. - як я вже говорив, я, можливо, доведеться досить скоро потрапити на ринок робочих місць, і я хочу мати основні мови для товарності, а не "одноразові". Багато завдань Python там - дуже погано, що більше не можу витримати Python!
Вектор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.