Чому більше Q6 не написано на Qt? [зачинено]


202

Наскільки я знаю і зрозумів у своєму досвіді роботи з Qt, це дуже хороша та проста у навчанні бібліотека. Він має дуже добре розроблений API і є кросплатформенним, і це лише дві з багатьох функцій, які роблять його привабливим. Мені цікаво знати, чому більшість програмістів не використовують Qt. Чи є дефіцит, який говорить проти цього? Яка особливість робить інші бібліотеки кращими за Qt? Чи пов'язане питання з ліцензуванням?


60
Це рідний C ++. Більшість розробників вважають за краще мови вищого рівня, такі як C #.
user16764

15
Двохгранний меч зворотної сумісності залишив Qt з багатьма анахронізмами, непоправними дефектами та іншими поганими поведінками.
edA-qa mort-ora-y

26
@ user16764: "Найбільше"?
Гонки легкості по орбіті

17
Я не думаю, що індекс TIOBE - це дійсно точний показник, оскільки він вимірює популярність, а не використання. Порівнюючи кількість коду у сховищах з відкритим кодом, як-от GitHub, Bitbucket, Codeplex та Sourceforge, було б дано більш точні вимірювання. (І я вважаю, що більш точні вимірювання ставлять C і C ++ в місцях №1 і №2 - Java має несправедливу перевагу в індексі TIOBE, оскільки він використовується для курсів першокурсників, а нові програмісти роблять більше шумів, ніж досвідчені).
Біллі ONeal

12
@Giorgio: Erm, вам доведеться думати про такі речі в C #. Поняття "кому належить це" виходить далеко за рамки "хто дзвонить delete". Те, що розумні вказівники роблять це явним, не є мовою, яка не відповідає; і якщо ви не думаєте про подібні речі, ви збираєтеся створювати сміття будь-якою мовою високого рівня, яку я теж бачив.
Біллі ONeal

Відповіді:


177

Я насправді не маю намір це бути хиткою відповіддю, але це причини, які я особисто не використовую Qt. Про це можна сказати багато хороших речей - а саме те, що API працює більшу частину часу і що він безперешкодно перемикає платформи. Але я не використовую Qt, оскільки:

  1. У деяких випадках він просто не схожий на рідні програми. Проектування єдиного інтерфейсу користувача для всіх платформ по суті не буде добре виглядати при переході з машини на машину з різних причин візуального стилю. Наприклад, на комп'ютерах Mac розбиті смуги зазвичай відносно товсті, а кнопки невеликі та закруглені піктограмами. На машинах Windows розрізні смуги зазвичай вузькі, а кнопки - більш текстові, з більш квадратними конструкціями. Тільки тому, що ви можете написати один інтерфейс для кожної платформи, це не означає, що ви повинні для більшості програм.
  2. Qt не є бібліотекою C ++. Це вимагає окремого кроку компіляції, що робить процес збирання набагато складнішим у порівнянні з більшістю інших бібліотек.
  3. В результаті (2), C ++ IDE та інструменти можуть позначати вирази Qt як помилки, оскільки вони не розуміють специфіку Qt. Це майже змушує використовувати QtCreator або текстовий редактор на зразок vim.
  4. Qt - це велика кількість джерела, яке має бути присутнім та попередньо встановленим на будь-якій машині, яку ви використовуєте перед компілюванням. Це може зробити налаштування середовища побудови набагато більш втомливим.
  5. Він доступний лише під LGPL, що ускладнює використання одно-бінарного розгортання, коли потрібно випускати за ліцензією більш обмежувальної чи меншої кількості.
  6. Він створює надзвичайно великі скомпільовані двійкові файли в порівнянні з аналогічно написаними "звичайними" власними програмами "(крім звичайних програм, написаних для KDE).

11
@Dehumanizer: Є ліцензія LGPL, а там комерційна ліцензія. Комерційна ліцензія складає тисячу доларів з боку ліцензіата і не дозволяє перерозподіляти тощо. Для проектів з відкритим кодом за ліберальними ліцензіями, такими як BSD, MIT або Boost, де автори не заробляють тонни грошей, і вони хочуть щоб випустити свій код під ліберальною ліцензією, залежність від LGPL є необґрунтованою, але розробники, про які йдеться, зазвичай не можуть дозволити комерційне ліцензування.
Біллі ONeal

27
# 6 - найбільша причина, чому я цього уникаю. Я маю на увазі, я не хочу великої, незграбної програми, і мені не подобається прив'язуватися до конкретної ліцензії, але це справді відсутність хорошого, рідного вигляду і відчуття, що це для мене зловмисник. Останні версії OSX та Windows спеціально виконали фантастичну роботу, щоб зробити свої рідні інтерфейси красивими, швидкими та функціональними, і я скоріше за все використовую роботу, яку ви вже зробили для мене; Я вважаю, що багато програм без рідного вигляду мені здаються дешевими і хиткими (не завжди, але це трохи знищує мене).
Грег Джексон

16
Ваше число 6 повинно було бути числом 1. Це, безумовно, найбільша проблема Qt. У багатьох випадках він просто не використовує нативні API. Мені подобається, що моє програмне забезпечення виглядає рідним. Користувачам це подобається теж. Я ніколи не бачив програми Mac, створеної за допомогою Qt, яка нагадувала програму Mac. Немає інших користувачів Mac, і вони вибагливі до подібних речей. Ви втрачаєте всю вигоду від того, що це "кросплатформна", якщо ви використовуєте її лише для створення додатків Linux, тобто про єдине місце, де воно виглядає як рідне, бо насправді немає нічого рідного.
Коді Грей

41
окрім проблеми «рідного» погляду вже немає. Стара послідовність додатків для Windows тепер є привабливою для будь-яких унікальних крапок, світіння та анімації WPF та сріблястого світла. Погляньте на панель управління Office або Windows 7, щоб побачити, як навіть у флагманського продукту МС є суперечливий графічний інтерфейс. Користувачі Mac - ну, ви маєте дуже вагомий пункт.
gbjbaanb

5
@TrevorBoydSmith: Вибачте, але ви помиляєтесь. Qt - єдиний фреймворк, який використовує попередню обробку. Період. Перевірте GNOME, FLTK, WX та друзів та покажіть мені крок попередньої обробки. Ви не знайдете його. Деякі інші бібліотеки оснащені різними системами побудови, але наприкінці дня вони є бібліотеками C ++, які можна створити будь-яким компілятором C ++. Що стосується "Raw win32, який не присутній у моїх причинах", він присутній у моїх причинах як №5 та №6.
Біллі ONeal

115

Як кажуть люди, кожен інструмент підходить до кожної проблеми та ситуації ...

Але якщо ви програміст на C ++, Qt - це ваша основа. Жодного суперника.

Ми розробляємо складний комерційний додаток для медичних зображень, і Qt тримається.

Я не кажу, що "мінуси", які люди говорять про це, помилкові, але у мене таке відчуття, що вони не пробували Qt тривалий час (його постійно вдосконалюється в кожній новій версії ...) І, в основному всі питання, які вони коментують, не є проблемою, якщо ви подбаєте.

Невідповідність платформи користувальницького інтерфейсу: лише якщо ви використовуєте віджети користувальницького інтерфейсу "такими, якими вони є", без будь-яких налаштувань або спеціальних зображень.

Перевантаження процесора Qt: Тільки якщо ви зловживаєте механізмом слотового сигналу або успадкуванням QObject, коли немає справді необхідності.

До речі, ми все ще пишемо додатки в C # .NET і робимо це вже давно. Тому я думаю, що я маю певну перспективу.

Як я вже говорив, кожен інструмент для кожної ситуації,

але Qt, без сумніву, є послідовною та корисною рамкою.


9
+1 Такс! Я просто хотів написати те саме. Найбільш нісенітниця - це "не відкритий / комерційний аргумент". Дивно, як неправильно багато людей розуміють термін Open-Source. Qt був з відкритим кодом, оскільки я ним користуюся (1.4). І раніше вона мала найбільш справедливу ліцензію: заробляйте гроші за допомогою Qt -> pay.
Валентин Хайніц

16
О, і я дійсно не переймаюся тим, як додати 10 МБ DLL-файлів у додаток, що містить 50 МБ мистецтва та ще 200 МБ відеоуроків та даних :)
Петър Петров

9
Простір, необхідний для Qt, є дешевим в наші дні.
trusktr

5
Це майже відповідає моєму досвіду роботи з Qt (рамки віджетів, до цього часу я не використовував QML / QtQuick для нічого серйозного). Доцільно писати великі програми зі складними вимогами до інтерфейсу. Після того, як ви це навчитесь, ви зможете бути дуже продуктивними. Згадані мінуси (окремий крок компіляції для макіяжу, файлів ui тощо) не є проблемою, якщо система збірки правильно налаштована. Я можу порекомендувати або qmake, або cmake.
Нільс

від Qt 5.8 згодом існує проект під назвою Qt Lite, який мінімізує надзвичайно Qt для ваших конкретних потреб. це комерційна особливість;)
SMMousavi

36

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

template < typename T >
struct templated_widget : QWidget
{
  Q_OBJECT;

public signals:
  void something_happened(T);
};

Він також не грає добре з препроцесором. Ви не можете цього зробити:

#define CREATE_WIDGET(name,type) \
struct name ## _widget : QWidget \
{ \
  Q_OBJECT; \
\
public signals: \
  void something_happened(type); \
}

Це в поєднанні з тим, що все, що реагує на сигнал, має бути Q_OBJECT, робить Qt важким для роботи програміста на C ++. Люди, звикли до програмування в стилі Java або Python, ймовірно, справді краще.

Я фактично витратив багато часу та зусиль на дослідження та розробку способу повернути безпеку типу та підключити сигнал Qt до будь-якого об’єкта функтора: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals -in-qt-step-1.html

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

Відверто кажучи, я застряг у цьому, тому що якщо ви хочете зробити автоматичне тестування на інтерфейс користувача, Qt є майже єдиною грою в місті, не маючи MFC ... що так 1980 року (це смокче працювати в цьому лайні дуже важко). Деякі можуть сказати WX, але це має ще більш серйозні проблеми. GTKmm був би моїм першим вибором, але оскільки все це влаштовано власником і не забезпечує доступність ... не може керуватися стандартним програмним забезпеченням для тестування. Qt в цьому відношенні досить важкий ( ледь працює, коли ви змінюєте плагін доступності).


1
З-за інтересу, що ви бачите як основні проблеми з WX?
Том Андерсон

7
@Tom - погана документація, особливо для нових матеріалів. Компоненти AUI ледь не задокументовані з відсутністю великих ділянок, що ускладнює використання у виробничих умовах. Документація для процесу події принципово помилкова стосовно дотримуваного шляху, принаймні, на win32. Провели багато часу, кричавши за комп’ютером, "Це має працювати !!!" перш ніж заглиблюватися в код глибокої обробки, щоб дізнатися, що те, що WX не слідкує за документами, і те, що я робив, ніколи не працюватиме.
Едвард Странд

1
Мене також непокоїло прийняття бібліотеки сітки власності в основний рядок. Я використав цю бібліотеку, і вона показала численні основоположні вади дизайну на додаток до фактичної недостатності знань від імені програміста, який її написав (наприклад, віртуальних функцій у конструкторах). Це та поганий стан АСІ показали тенденцію до зниження рівнів. Я також не є великим шанувальником статичних таблиць подій, хоча, принаймні, є інший спосіб реагувати на події ... на відміну від MFC, якому WX просто дуже хочеться захоплювати.
Едвард Странд

Дякую. Я лише трохи його використав, і через API wxPython, де це здалося досить приємним. Я можу оцінити, що це приховало б щось зло, але також і те, що я просто не настільки глибоко залучений, щоб зіткнутися з більш серйозними проблемами. Щось мені слід знати.
Том Андерсон

1
все, що реагує на сигнал, повинно бути Q_OBJECT, зараз немає. Тепер статичні функції, функції і навіть лямбда-функції можуть відповідати на сигнал (ви можете використовувати функціональні вказівники як слоти). Класи No-QObject також можуть мати слоти членів, якщо ви підключаєтесь до них за допомогою std :: bind для перетворення члена екземпляра у покажчик функції.
Вініцій А. Хорхе

28

Однією з причин не використовувати Qt є те, що якщо ви пишете лише для однієї архітектури, наприклад Windows, ви можете використовувати C # /. NET (або Cocoa на Mac), оскільки вони незмінно зможуть скористатися останніми дзвонами -звуки ОС.

Якщо ви пишете крос-платформні програми, то, можливо, ви вже сильно орієнтуєтесь на іншу технологію, таку як Java (тобто ви працюєте в «Магазині Java»). Ваш вибір технології може бути продиктований екосистемою, в якій ви розвиваєтесь, наприклад, API, орієнтований на мову. У таких випадках може бути корисним мінімізація кількості технологій.

Третя причина, про яку я можу подумати - це те, що Qt базується на C ++, а C ++ є порівняно важкою / небезпечною мовою для програмування. Я думаю, що це мова для професіоналів. Якщо вам потрібно мати високу продуктивність і здатні бути прискіпливими, то C ++ - це, мабуть, найкраща гра в місті. Насправді Qt полегшує багато проблем із керуванням пам’яттю, якщо ви налаштовуєте речі випадати за межі сфери. Також Qt добре справляється із захистом користувача від багатьох неприємних проблем C ++. Кожна мова та рамки мають свої плюси і мінуси. Це дуже, дуже складне питання, яке, як правило, може бути узагальнене за допомогою додавання, яке часто зустрічається в закусочних: швидкість, якість та ціна (але ви можете вибрати лише два).

Хоча правила говорять, що я повинен залишатися зосередженим на відповіді на питання, я хочу спростувати деякі питання, порушені Біллі ONeal, який, на мою думку, робить хорошу роботу, узагальнюючи загальноприведені причини не використовувати Qt:

  1. Qt - це фактично файли бібліотеки / рамки / заголовки C ++. Це доповненоза допомогою макропроцесора (moc), який включає сигнали та слоти, серед іншого. Він перетворює додаткові макрокоманди (наприклад, Q_OBJECT), щоб у класах було самоаналіз та всілякі інші смаколики, які можна подумати як додавання функціональності Objective-C до C ++. Якщо ви знаєте достатньо про C ++, щоб образитися на цю відсутність чистоти, тобто ви професіонал, то 1) не використовуйте Q_OBJECT та його подібні або 2) будьте вдячні, що це робить, і програмуйте навколо дуже обмежених кутових випадків де це спричиняє проблему. Для людей, які кажуть "Використовуйте Boost для сигналів та слотів!" то я б сказав, що ви обмінюєте одну "проблему" на іншу. Підвищення величезне, і у нього є свої часто цитовані проблеми, такі як погана документація, жахливий API та крос-платформні жахи (подумайте про старі компілятори, такі як gcc 3.

  2. Що стосується підтримки редактора, це також випливає з 1, я дещо згоден. Насправді, Qt Creator - це найкращий графічний редактор C ++ за період, навіть якщо ви не використовуєте речі Qt. Багато професійних програмістів використовують emacs та vim. Крім того, я думаю, Eclipse обробляє додатковий синтаксис. Таким чином, не виникає проблем з макросами Qt (Q_OBJECT) або доповненнями сигналів / слотів. Ви, мабуть, не знайдете цих макросів у Visual Studio, оскільки (зізнаюся) вони є доповненням до C ++. Але за великим рахунком, C # /. NET люди все одно не будуть використовувати Qt через те, що вони мають багато функціональних можливостей, покритих власними власними методами.

  3. Щодо розміру джерела Qt, доки він збирається протягом ночі, кого це цікавить? Я склав Qt 4 на своєму двоядерному Macbook у «менше, ніж за добу». Я, безумовно, сподіваюся, що це не те, що визначає ваше рішення використовувати чи не використовувати певну технологію. Якщо це справді проблема, то ви можете завантажити попередньо складені пакети SDK для Mac, Linux та Windows з веб-сайту Qt.

  4. Ліцензування доступне у трьох варіантах: 1) Власна ліцензія на випадок, якщо ви бажаєте змінити Qt ITSELF, а не поділитися, або приховати той факт, що користуєтесь Qt і не бажаєте давати атрибуцію (це може бути дуже важливо для брендингу та іміджу!) 2 ) GPL та 3) LGPL. Так, є проблеми зі статичним зв’язком (перекочування всього Qt у двійкове) - але я думаю, що це більше, тому що не можна зазирнути всередину і помітити, що ти використовуєш Qt (атрибуція!). Я спробував придбати власну ліцензію у Digia, і вони сказали мені, "що ти робиш, тобі це справді не потрібно". Ого. Від бізнесу, який займається продажем ліцензій.

  5. Розмір двійкового файлу / пакету пояснюється тим, що ви повинні поширювати Qt речі людям, у яких його немає: Windows вже має? речі Visual Studio або вам доведеться встановити час виконання. Mac вже поставляється з величезним какао, і його можна динамічно пов'язати. Хоча я не займаюся великим розповсюдженням, я ніколи не зустрічав особливих проблем з розповсюдженням статичного файлу ~ 50 мегабайт (який я можу зробити ще меншим за допомогою деяких бінарних утилітів / утиліт, таких як UPX). Мені просто не все одно, щоб це зробити, але якби пропускна здатність коли-небудь була проблемою, я б додав крок UPX до свого сценарію збирання.

  6. Що визначає "Рідний погляд і почуття?" Я думаю, що "більшість" погодиться з тим, що Mac наближається до єдиного вигляду та почуття. Але тут я сиджу, дивлячись на Safari, iTunes, Aperture, Final Cut Pro, Pages тощо, і вони не схожі ні на що, незважаючи на те, що їх виготовляє постачальник ОС. Я думаю, що аспект "відчуття" є більш релевантним: стилізація віджетів, чуйність і т. Д. Якщо ви дбаєте про чуйність, то тут є вагомий привід використовувати C ++, а не Java або іншу дуже динамічну мову. (Завдання C також хитається, але я намагаюся розвіяти міфи про Qt)

Підсумовуючи це, складне питання. Але я хотів би зазначити, що я думаю, що є менше причин "не використовувати Qt", як можна думати, грунтуючись на міфах та застарілій інформації.


1
Чого я не отримую, це те, що ці бібліотеки між платформами не є просто функціями обгортки, а ще краще; якщо параметри навколо функцій Cocoa, Win32, KDE / Gnome, забезпечуючи найкраще виглядає інтерфейс користувача, з усіма його функціями.
MarcusJ

2
@MarcusJ Написання обгортки навколо одного інструментарію явно нетривіально, неважливо, 4 чи більше - але якщо ви думаєте, що це так просто, ви можете спробувати. Що стосується ідеї, що цього можна досягти, використовуючи лише умовну попередню обробку ... ви повинні жартувати, правда?
підкреслюйте_d

@MarcusJ libui - це саме те (хоча без підтримки KDE).
Демі

Хочу додати, що тепер ви можете використовувати Qt / QML з .NET. Вам не потрібно торкатися C ++. github.com/qmlnet/qmlnet PS: Я автор.
Пол Нопф

26

Деякі з них - ліцензування. Дивіться https://en.wikipedia.org/wiki/Qt_(software)#Ліцензування деяких історій ліцензування. До 2000 року люди, які сильно піклувалися про відкритий код, не використовували Qt. Період. (Це, власне, і було початковою мотивацією для розвитку Gnome.) До 2005 року люди, які хотіли мати можливість випускати безкоштовне програмне забезпечення для Windows, не використовували Qt. Навіть після цієї дати люди, які хотіли безкоштовного програмного забезпечення під чимось іншим, ніж GPL, просто не мали можливості використовувати Qt. Таким чином, будь-який проект вільного програмного забезпечення, який старше цих дат, не міг використовувати Qt. І, звичайно, люди, які пишуть майновий код, повинні були платити за пільгу.

Крім того, це не так, як дефіцит інших варіантів. Наприклад, WxWidgets , GTK + і Tk - це всі програми з відкритим кодом, міжплатформні набори інструментів.

Крім того, довгий час Windows була настільки домінуючою на робочому столі, що багато програмного забезпечення вміщувалося лише для Windows. Якщо ви встановите ланцюжок інструментів Microsoft, простіше просто використовувати власні речі Microsoft, ніж турбуватися про що-небудь інше, і багато програмістів зробили саме це.


1
@btilly: GTK + - кросова платформа. Наприклад, клієнт Pidgin IM записується на GTK +.
Біллі ONeal

1
Добре, однак, можна «якось» запустити в Windows :)
Dehumanizer

6
Просто встановіть GIMP на Windows і подивіться.
користувач281377

2
Так, і GIMP добре працює в Windows, але це, звичайно, не вписується в зовнішній вигляд інтерфейсу Windows 7.
Алан Б

5
Pidgin - це, мабуть, кращий приклад GTK для Windows. Це не робить нічого фантазійного, але вписується в нього і може бути 10 і більше років?
Брендан Лонг

14

Я погоджуюся майже з усіма вищезгаданими причинами, проте багато людей тут сказали, що не використовуватимуть Qt через додаткові накладні витрати, які він приносить із собою. Я не погоджуюся з цим, тому що всі найпоширеніші мови сьогодні (Java, C # і Python) несуть на собі досить великі витрати.

По-друге, Qt робить програмування на C ++ настільки простим і прямим, що компенсує додаткові ресурси, які він використовує. Я натрапив на досить багато консольних програм, написаних на Qt, а не на стандартних C ++ через простоту, в якій їх можна записати.

Я б сказав, що продуктивність Qt більша, ніж у C / C ++, але менша, ніж у мов, таких як Python.


2
Я думаю, це все відносно досвіду особистості, тому що я можу кодувати ОК у C ++ 14, але щоразу, коли я дивлюся на якийсь код Qt, мені доведеться важко косити, щоб розпізнати його як ту саму мову ... тому я, звичайно, не Я не думаю, що це одностайне підвищення продуктивності, яке ви маєте на увазі тут.
підкреслюйте_d

1
@underscore_d очевидно, якщо ти дуже добре знаєш C ++ і не знаєш Qt, ти не будеш більш продуктивним з останнім. Але коли ви знайомитесь як з C ++, так і з Qt, рамки дійсно роблять багато речей простішими та швидшими для впровадження (C ++ 11, 14 тощо заповнюють прогалину, але ще не повністю).
ymoreau

11

Це справді не спроба розпочати полум’яну війну, я просто хотів розглянути деякі моменти.

Можливо, справжньою причиною того, що Qt не використовується широко, є те, що це C ++ і все менше людей використовують c ++ для настільних додатків.

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

Vs-addin для візуальної студії робить це автоматично, як і власний командний рядок Qt. Компілятор ресурсів, який використовується для створення діалогів для MFC, також є окремим кроком, але це все ще c ++.

Qt - це велика кількість джерела, яке має бути присутнім та попередньо встановленим на будь-якій машині, яку ви використовуєте перед компілюванням. Це може зробити налаштування середовища побудови набагато більш втомливим.

Існує бінарне завантаження для кожної версії візуальної студії, і збірка з джерела - це одна команда. Я не бачу, що розмір джерела SDK в наші дні не так угодний. Visual studio тепер встановлює всі C ++ libs, а не дозволяє вам вибирати та вибирати, в результаті розмір інсталятора компілятора становить> 1Gb.

Він доступний лише під LGPL, що ускладнює використання одно-бінарного розгортання, коли потрібно випускати за ліцензією більш обмежувальної чи меншої кількості.

LGPL застосовується лише до lib, це не впливає на ваш код. Так, це означає, що вам доведеться надсилати DLL, а не один бінарний (якщо ви не платите), але в світі, де вам потрібно завантажити час виконання Java або оновлення .Net для крихітного утиліта, це не така вже й велика справа. Також менше проблем на платформах з одним ABI, щоб інші додатки Qt могли спільно використовувати файли.

У деяких випадках він просто не схожий на рідні програми. Проектування єдиного інтерфейсу користувача для всіх платформ по суті не буде добре виглядати при переході з машини на машину з різних причин візуального стилю.

Тут слід використовувати рідні віджети та теми. Я мушу визнати, що я в основному технічні додатки, тому мої користувачі не надто переймаються стилем. Тим більше, що в Windows нова мода на те, що все є стиль як смартфон віджет, означає, що стандартів все одно менше.


1
Дуже багато великих програмних компаній будують комерційні програми на C ++, але я не знаю дуже багатьох, які використовують QT. Тож, як я розумію, що розробники, які не містять C ++, можуть уникати QT, є й інші причини уникати QT, навіть коли ви пишете додаток C ++, здавалося б. Насправді, насправді не існує жодної крос-платформної мови та інструментарію графічного інтерфейсу, з яким я не можу помилитися. Здається, що розробка міжплатформних програм - ПЕРЕГЛЯДУЙТЕ ХАРД, і робити це добре ніколи не буває просто і безкоштовно, і що обіцянка QT робить (Напишіть свій GUI один раз і повторно використовуйте цей графічний інтерфейс скрізь) недостатньо.
Warren P

Більшість програмного забезпечення на C ++ для настільних ПК є або в MFC, оскільки воно було запущено 20 років тому, або використовується внутрішній набір інструментів, запущений 20 років тому, щоб уникнути MFC (наприклад, MS-Office або Autocad). Я дуже сумніваюся, що написано в C ++ / CLR з WPF. Але навіть без міркувань між платформами, я вважаю Qt найкращим (або найменш гіршим!) Набором інструментів для настільних ПК. Як і більшість людей, ми рухаємось до переднього кінця веб-веб-сторінки (можливо, у QtQuick / QML) та сервера C ++, який, ймовірно, використовуватиме сигнали / слоти Qt, але без gui
Мартін Бекетт

Я згоден. Найменше найгірше. Навіть у додатках, що стосуються лише Windows, я б швидше налагоджував QT, а не MFC.
Warren P

@WarrenP - так, я не пропускаю пошук кодового проекту для всіх матеріалів, відсутніх у MFC. Але завдяки новому знайденому коханню MSFT до рідного коду - вони не зробили багато для того, щоб полегшити написання Gui.
Мартін Бекетт

7

Причина проста: він не має гарних прив’язків до всіх основних мов, і це не магічно завжди підходить для роботи, що знаходиться під рукою.

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

Що стосується більш загальної відповіді (яку я можу дати, тому що я тут актуальна), деякі програмісти просто ніколи не дадуть їй піти і вирішили використовувати її. У деяких випадках немає жодної конкретної причини, крім того, що програміст ніколи не знаходив потреби в цьому і не заглядав у нього.


1
Але Qt забезпечує можливість писати лише консольні програми. Чи не так?
Дегуманізатор

9
@Dehumanizer: Я поняття не маю. Але навіщо я використовувати його для невеликого корисного інструменту? Яку користь це може принести мені, коли я можу тривіально написати заявку просто у стандартному C ++? Здається, ви шукаєте причину використовувати бібліотеку , яка є зворотним способом програмування.
Гонки легкості по орбіті

12
@Dehumanizer: Як я вже сказав, це підхід назад. Коли ви знайдете потребу в бібліотеці, ви дізнаєтесь, а потім можете спробувати декілька і побачити, що краще відповідає вашим потребам. Намагання зібрати думку про бібліотеку, коли у вас немає справи про використання, - це дурень.
Гонки легкості по орбіті

3
"Якщо я пишу просту програму командного рядка, то чому б я зруйнував це з Qt просто заради цього", принаймні один дуже відомий інструмент не-гуї написаний на Qt - Doxygen :-)
Валентин Хайнциц

4
@Dehumanizer, наприклад, коли вам доведеться дуже швидко працювати з файлами, xml, unicode, json, regexp, concureency, базами даних тощо, тощо, і не хочуть завантажувати, приймати, підтримувати десяток сторонніх бібліотек.
Валентин Хайніц

5

Рамки типу Qt доцільні, коли ви більше переймаєтесь тим, як ваш продукт виглядає однаково на всіх платформах, ніж ваш продукт виглядає правильно на всіх платформах. В наші дні все частіше такі програми переходять на веб-технології.


4

Я погоджуюся, що Qt - це приємна основа для роботи. Однак у мене є низка питань:

  1. Він написаний на C ++, що є дійсно низькою мовою. Сам факт, що це C ++, зробить кожного програміста Qt значно менш продуктивним порівняно з Frameworks, написаним іншими мовами. Моя головна яловичина з мовою розробки графічного інтерфейсу C ++ полягає в тому, що вона не має поняття автоматичного управління пам'яттю, що робить процес розробки набагато більш схильним до помилок. Це не інтроспектива, що робить налагодження набагато складніше. Більшість інших основних наборів інструментів GUI мають деяке поняття автоматичного управління пам'яттю та самоаналізу.
  2. Кожен набір інструментів для різних платформ страждає від проблеми, яка лише коли-небудь може реалізувати найменший загальний знаменник усіх підтримуваних платформ. Це та різні вказівки щодо користувальницького інтерфейсу на різних платформах дуже сильно ставлять під сумнів бажаність взаємних платформних інтерфейсів.
  3. Qt дуже орієнтований на кодування всього вашого інтерфейсу. Незважаючи на те, що ви можете використовувати QtDesigner для створення деяких частин інтерфейсу користувача, його серйозно не вистачає порівняно з, скажімо, (Cocoa / Obj-C) Interface Builder або інструментами .Net.
  4. Навіть незважаючи на те, що Qt включає багато функціональних додатків низького рівня, він не може порівнюватись з тим, щоб рамки були налаштовані вручну для певної платформи. Народні бібліотеки операційної системи для Windows і OSX значно потужніші, ніж реалізація Qt. (Подумайте про аудіокадри, доступ до файлової системи низького рівня тощо)

При цьому я люблю використовувати PyQt для швидкого прототипування додатків або внутрішніх додатків. Використання Python для виконання кодування полегшує проблеми C ++ і фактично робить Qt дуже приємним місцем.


Редагуйте у відповідь на деякі коментарі:

Коли я писав про те, що Qt пишеться на C ++, я не стільки скаржився на сам Qt, скільки більше на навколишнє середовище, в якому живе. Це правда, що Qt дуже добре керує власними ресурсами, але всі ваші графічні інтерфейси пов'язані з графічним інтерфейсом. код не-Qt теж повинен бути записаний на C ++. Навіть там Qt надає багато приємних інструментів, але в кінцевому підсумку вам доведеться мати справу з C ++ на цьому рівні. Qt робить C ++ переносимим, але це все-таки C ++.

Що стосується самоаналізу, то, що я маю на увазі, це таке: Найважчі випадки налагодження - це коли у вас є вказівник на якийсь об’єкт, який веде себе не так, як ви думаєте, як слід. За допомогою C ++ ваш налагоджувач може трохи заглянути всередині цього об'єкта (якщо трапляється інформація про тип у точці wwt), але навіть це не завжди працює. Візьміть, з іншого боку, какао в тій же ситуації. У програмі Cocoa / Obj-C ви могли б надсилати повідомлення ("функції виклику") об'єкту прямо в межах налагоджувача. Ви можете змінити стан об'єктів, ви можете запитати його на його атрибути, ви можете запитати його тип та назви функцій ... Це може зробити налагодження набагато зручнішим. Qt / C ++ не має нічого навіть близького до цього.


11
1. Qt піклується про управління пам'яттю самостійно, вам не потрібно викликати "видалити" після кожного "нового". 1а. C ++ НЕ є мовою низького рівня, це мова високого рівня з низькими рівнями "здібностей". 3. Я погоджуюся, але Qt передбачає одночасно створити інтерфейс користувача з QtDesigner та з "простим кодом". 4. Погодьтеся ще раз, але Qt також передбачає використання нативних API.
Дегуманізатор

11
до вашої точки зору 1. Я думаю, що у C ++ є своєрідне напівавтоматичне управління пам’яттю: якщо ви використовуєте розумні покажчики, такі як std :: auto_ptr або boost :: shared_ptr тощо. Ви, як правило, не повинні піклуватися про звільнення пам'яті. Такі контейнери можна виготовити і для інших ресурсів (файли, системний ресурс, які потрібно звільнити). Використання шаблону RAII дуже допомагає в управлінні пам’яттю, і, як він переростає у вас, вам не потрібно турбуватися про пам’ять.
дене

8
"Сам факт, що це C ++, зробить кожного програміста Qt значно менш продуктивним порівняно з Frameworks, написаним іншими мовами." [потрібна цитата]
Натан Осман

4
@ SK-логіка: Хоча я думаю, що я розумію всі слова у вашому третьому реченні, я поняття не маю, що ви говорите. Що таке "рівень обмеження абстракції"? З цього приводу ваше перше речення є помилковим, враховуючи визначення у Вікіпедії "мови низького рівня".
Девід Торнлі

6
@ SK-логіка: Метапрограмування шаблонів завершено Тьюрінгом, і люди мають достатньо розумних та знаючих людей, щоб скористатися цим. RAII - це не велике збирання сміття, але той факт, що він працює на всілякі ресурси, більш-менш доповнює це. Тепер, конкретно, яка абстракція працює в Java, але не C ++?
Девід Торнлі

3

Мені дуже подобається Qt, але він трохи важкий для багатьох застосувань. Іноді просто не потрібен такий рівень складності. Іноді вам просто потрібне щось просте без усіх накладних витрат Qt. Не кожну програму потрібно керувати подіями, а C ++ надає розумний набір шаблонів. Boost забезпечує ще один дуже хороший набір і включає багато функцій низького рівня (файли, сокети, керовані покажчики тощо), які робить QT.

Інші програми мають ліцензійні вимоги, які не відповідають вимогам комерційної ліцензії GPL, LGPL або Qt. GPL не підходить для комерційного програмного забезпечення. LGPL не підходить для статично пов'язаного програмного забезпечення, а комерційна ліцензія коштує грошей - те, що багато хто не хоче платити.

Деякі з міркувань безпеки або стабільності, які не дозволяють складною бібліотекою на зразок Qt.

Вам потрібно запустити moc, щоб попередньо обробити джерела. Це не величезна проблема, але це може бути неприємним для нового користувача. Дуже багато програмістів вважають, що вам потрібно використовувати qmake з Qt, але це неправильно. Можна підключити Qt до інших систем побудови досить легко.

Деякі цілі дуже обмежені пам'яттю або процесором.

У ньому є деякі специфічні платформи. Більшість цих ґатунків недокументовані. Створіть достатньо велику програму, і ви наткнетесь на них і здивуєтеся, що відбувається (відмова, останній раз, коли я використовував Qt у гніві, було понад 18 місяців тому, тому він, можливо, покращився).

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

Є багато причин не використовувати Qt, тому існують альтернативи. Якщо все, що у вас є, це молоток, то кожна проблема буде схожа на цвях.


3

Найголовніше, але не згадане. У великому проекті одна річ викликає стільки проблем і непотрібного коду. Механізми слота сигналу Qt неефективні. Qt віджети не подають необхідних сигналів для простих віджетів подій. Наприклад, ви не можете встановлювати сигнали для onHover, onMouseEnter, onMouseLeave, onKeyReleased, onLostFocus, onGainFocus тощо. Навіть найскладніший віджет, такий як QTreeWidget, надає один або два надпрості непотрібні сигнали.

Так, ви можете використовувати події, АЛЕ !!! ви створили новий клас для кожного віджета за допомогою спеціальної події. Це величезна втрата ефективності;

  • Ви переписали кожну індивідуальну подію об’єкта віджета, там є невеликі зміни.
  • Ви втрачаєте всі речі дизайнера Qt. Ви повинні рекламувати кожен віджет за допомогою спеціальних заходів.
  • Проект став більшим і важким для обслуговування.
  • Ви через це не любите qt. І почати говорити про те, як .net надає делегатів, як це набагато набагато краще, ніж слот сигналу, як .net компоненти (віджети) загалом надають кожну подію, яку ви можете собі уявити. І т.д.

Один з мого коледжу написав новий клас комбо-коробки для кожного віджета комбо-боксу, тому що йому довелося використовувати якусь подію без сигналу. Правдива історія...

Однак Qt - найкраща система C ++ UI на даний момент із падіннями та підйомами.


Щодо подій та створення нових класів: ви можете використовувати фільтри подій у класах, які потребують реакції на них.
MrFox

"Так, ви можете використовувати події, АЛЕ !!! Ви створили новий клас для кожного віджета за допомогою спеціальної події. Це втрачена величезна ефективність;" - НЕ ЗОВСІМ. Я просто закінчую bool eventFilter, який обробляє кілька віджетів, а потім встановлюєEventFilter (це) на всі дочірні віджети. І це не втрачає ефективності та програмування! Насправді я ніколи не використовую "Рекламні віджети" ... Я відкидаю просто звичайний порожній віджет, встановлюю його як eventFilter на ньому та повторюю більшість моїх подій у моєму основному класі CPP. Спробуйте, не
боліть

3

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


2

Фактична причина не технічна.

Люди бувають різними. Так само їх вибір. Одноманітність - це не людська особливість.


Це тому всі люди ходять на ногах? Ну, у тих, у кого ноги хоча б ...
dtech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.