Почему разработчик сгенерировал классы пользовательского интерфейса, встроенные как «Агрегация», не могут реализовать пользовательские слоты? - PullRequest
3 голосов
/ 08 апреля 2011

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

  1. Агрегация в качестве указателя
  2. Aggregation
  3. множественное, частное наследство

enter image description here

но сказано, что второй метод не поддерживает пользовательские слоты. Может кто-нибудь уточнить это? Почему мы не можем реализовать пользовательские слоты, используя агрегацию?

Кроме того, уточните преимущества и недостатки каждого из методов.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Я не думаю, что это правда, что второй вариант не поддерживает пользовательские слоты.

Выбор обсуждается в официальной документации Qt.См. http://doc.qt.io/qt-4.8/designer-using-a-ui-file.html#compile-time-form-processing

Однако обратите внимание, что три подхода, представленные в этом документе, не соответствуют трем вариантам, представленным в Qt Creator.Первый подход, представленный в документе, «Прямой подход», здесь не является одним из трех вариантов - этот подход недоступен через функцию Qt Creator, которой управляет этот параметр.Второй вариант (агрегация или «подход с единым наследованием») доступен в двух вариантах, при этом небольшое изменение состоит в том, является ли член класса пользовательского интерфейса элементом данных (второй параметр) или элементом указателя (первый параметр).

Я предпочитаю третий вариант - множественное наследование.Этот способ также используется в Программирование на C ++ GUI с использованием Qt 4 (первое издание доступно бесплатно онлайн ), что называет этот подход наиболее чистым.Когда я пишу свой класс, я на самом деле не думаю о двух объектах: один с пользовательским интерфейсом, а другой с функциональностью, я думаю только об одном, и множественное наследование соответствует этому лучше всего.Но в документе приведены причины, по которым «агрегация как элемент указателя» используется по умолчанию.

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

Обновление QT5:

В настоящее время вы можете поддерживать пользовательские слоты в большем количестве мод, например, используя лямбду и поддержку нормальной функции для слотов (отметьте здесь) .

Также обратите внимание, что рекомендуемым вариантом является Элемент указателя , также известный как идиома Pimpl. Преимущество заключается в том, что предварительное объявление объекта UI позволит быстрее компилировать большие проекты, а также совместно используемые библиотеки легко упаковать (как указано здесь) .

...