Насколько пригоден Qt без шага предварительной обработки? - PullRequest
58 голосов
/ 28 августа 2010

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

Насколько пригоден Qt без шага предварительной обработки?

РЕДАКТИРОВАТЬ: Ладно, я не это имею в видувопрос как разорванный на Qt - слишком много фанатов Qt рассматривают это как если бы это было так.Я не хочу обсуждать достоинства того факта, что Qt придумала этот инструмент предварительной обработки.Я понимаю, почему этот инструмент есть, и я понимаю, почему существуют большие части дизайна Qt, которые основаны на идее предварительной обработки.

Я никогда не использовал Qt, поэтому я не в состоянии разобратьЭто.Но я бы предпочел заплатить в письменном виде небольшую часть шаблона самостоятельно и не зависеть от разрыва всего процесса сборки.Я не буду использовать Flex и Bison в моем текущем проекте по той же причине;если я не буду использовать эти инструменты, я определенно не собираюсь использовать другой вид предварительной обработки.

Так что, пожалуйста, не воспринимайте меня как копирование на Qt.Я не могу комментировать, насколько это хорошо или нет;Я не использовал это.Я просто хочу знать, возможно ли использовать его без moc.

Ответы [ 12 ]

26 голосов
/ 28 августа 2010

Qt не требует использования moc только для его использования, оно требует его использования, если вы создаете подкласс QObject и объявляете сигналы и слоты в ваших пользовательских классах.

Это не лишено смысла, moc предоставляет функции, которых нет в C ++, сигналы / слоты, самоанализ и т. Д.

Итак, чтобы сделать что-то минимально продвинутое, вам придется использовать препроцессор moc. Вы либо любите это, либо ненавидите это.

5 голосов
/ 28 августа 2010

Я не считаю необоснованным, что Qt требует специального инструмента предварительной обработки, учитывая, насколько она обширна и обширна.

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

Как уже было сказано,тем не менее, вы можете использовать Qt без moc, но не все, что требует сигналов и слотов.Да, это включает все графического интерфейса, но Qt никоим образом не просто библиотека графического интерфейса.

4 голосов
/ 31 августа 2016

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

Это называется "Вердигрис"

(кроме того, moc на самом деле не столько этап предварительной обработки, сколько генератор кода. Код, который вы пишете, является допустимым C ++, и moc ничего не меняет. Он просто генерирует дополнительный код C ++ для вас. )

4 голосов
/ 28 августа 2010

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


Кроме того, как я отмечаю, в моеммнение, причина того, что вы получаете как можно больше защиты от Qt и moc, заключается в том, что вы начали свой вопрос со строго сформулированного слова «я думаю, что это неразумно», которое легко интерпретировать как означающее, что вы не думаете, что moc когда-либо существовал.Это отвлекает от вашего фактического вопроса.Я думаю, что было бы лучше просто сказать «moc не вписывается в мою систему сборки» или просто «у меня есть свои причины не использовать его».

4 голосов
/ 28 августа 2010

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

Без moc вы не можете

  • Использовать сигналы и слоты (которые все, но необходимы для пользовательского интерфейса)
  • Использование динамической системы свойств (помимо прочего, необходимо для написания плагинов)
  • Использование функций интернационализации
  • Ожидайте, что кто-нибудь получит помощь, когда ничего не работает

Если вы хотите использовать Qt, используйте moc. На самом деле, даже не беспокойтесь о moc - просто используйте QMake. Вы можете написать файл .pro QMake, который выглядит следующим образом:

TARGET = myApp

FORMS += MainWindow.ui

HEADERS += MainWindow.h

SOURCES += MainWindow.cpp
SOURCES += main.cpp

Все позаботится автоматически. Или вы можете потратить все свое время, пытаясь понять, как избежать moc.

См. https://doc.qt.io/archives/qt-4.7/metaobjects.html и https://doc.qt.io/archives/qt-4.7/moc.html#moc

3 голосов
/ 28 августа 2010

Я действительно не могу придумать ничего настолько уникального и полезного с Qt без использования QObjects.Я бы хотел, чтобы они обошли этот этап предварительной компиляции.

2 голосов
/ 08 октября 2010

Вы можете использовать Qt без moc, но тогда вы потеряете определенные функции, особенно те, которые делают Qt интересными в первую очередь (такие как большая часть GUI, сигналы и слоты, а также перевод строк).Но это все еще хорошая библиотека общего назначения, даже без moc.

2 голосов
/ 28 августа 2010

Возможно ли это?Возможно, до тех пор, пока вы не занимаетесь программированием на графическом интерфейсе.Лично я в основном работаю с PyQt в эти дни, так что это не большая проблема для меня.

Почему вас это не должно волновать: учитывая природу "прекомпиляции", если вы используете cmake или qmake, это не такдействительно большое дело с точки зрения неудобств.Если в наши дни вы что-то делаете с графическим интерфейсом, вы все равно должны использовать графический дизайнер для большей части работы, поэтому вы уже добавляете некоторые этапы «предварительной компиляции».

Относительно того, почему они это сделалиit: Вам может быть интересно прочитать объяснение Qt: http://doc.qt.io/qt-4.8/templates.html

Это сводится к:

  • В шаблонном решении отсутствуют свойства и перегрузка
  • Решение mocпредотвращает нарушение двоичной совместимости сигналов
  • Анализ и изменение времени выполнения возможны с помощью механизма без шаблонов сигналов / слотов

С другой стороны, многопоточность сигналов / слотов также является преимуществомих система.

1 голос
/ 05 сентября 2013

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

class SignalProxy : public QWidget
{
public:
  SignalProxy() {}

  void setVisible( bool isVisible )
  {
     // Do whatever you want to do when the signal is emitted.
  }
};


// code to connect the signal, e.g., to a QWebView object
SignalProxy proxy;
QWebView webview;
QObject::connect( &webview, SIGNAL(loadFinished(bool)),
        &proxy, SLOT(setVisible(bool)) );

Это не красиво, но оно выполняет свою работу.Если бы вы действительно намеревались обойтись без MOC, вы, вероятно, могли бы найти существующие объекты Qt для использования в качестве прокси практически для любой необходимой сигнатуры сигнала, например, классы QAbstract ... имеют много виртуальных слотов, и вы можете скрыть все это.злобность в библиотеке, которая обеспечивает сигналы повышения или API стиля tr1 :: function <> для подключения к сигналам QT.

Вызов слотов на объектах QT менее важен, чем прием сигналов, так как обычно вы можете вызыватьметод слота напрямую.

1 голос
/ 30 ноября 2010

В настоящее время я нахожусь в положении необходимости искать альтернативы МОК.Пока что я использую GLib для перевода текста, и я нахожусь в процессе реинжиниринга библиотеки сигналов / слотов, которую я нашел в сети (sigslot), используя шаблоны C ++ и макросы C вместе.Скучная и утомительная часть - переделывать графический интерфейс моего приложения и заменять обычные виджеты Qt моими собственными виджетами (т.е. QPushButton -> MyPushButton) посредством продвижения виджетов (функция Qt Designer).Таким образом, мои виджеты могут генерировать шаблонные сигналы вместо Qt.Там есть подвох, хотяМои «модифицированные» классы виджетов ДОЛЖНЫ выполняться через препроцессор, но это шаг один в жизни.После этого я могу двигаться дальше.

Я могу позволить себе делать все это только потому, что я уже написал библиотеку Application Framework со своим собственным циклом событий (ну, это оболочка, которая добавляет в код цикла событий Qt), многопоточность, строковые классы и т. д. Мой проект будет нуждаться только в Qt для отображения хороших и изящных виджетов.

Но если у вас нет этих инструментов в вашем распоряжении - что я уверен, что вы неt - поверьте мне, попытка избавиться от препроцессора Qt будет настоящей болью в заднице.

Вот мое сообщение для вас: если вы можете использовать QMake или moc, просто используйте их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...