Использование любой функции c ++ в качестве слота Qt - PullRequest
12 голосов
/ 29 марта 2012

Есть ли способ использовать любую функцию C ++ в качестве слота Qt, не имея своего класса, унаследованного от QWidget?

Ответы [ 5 ]

10 голосов
/ 29 марта 2012

Вы не можете в версиях Qt

Чтобы использовать сигналы / слоты, должен быть вызван компилятор мета-объекта.Чтобы это произошло, ваш класс должен соответствовать следующим требованиям:

  • Наследовать от QObject или любого другого подкласса (например, QWidget, QPushButton и т. Д.)
  • Q_OBJECT макрос должен быть определен в закрытом разделе класса для включения функций мета-объектов, таких как слоты
  • . Используйте Qt ключевые слова slots и signals, чтобы объявить, какие функции должны бытьобрабатывает мета-компилятор как слоты или сигналы

Для получения более подробной информации посетите соответствующие страницы документации о мета-объектной системе и сигналов и слотов

Также проверьте документацию QObject:

Обратите внимание, что макрос Q_OBJECT является обязательным для любого объекта, который реализует сигналы, слоты или свойства. Вам также нужно запустить Meta Object Compiler для исходного файла.Мы настоятельно рекомендуем использовать этот макрос во всех подклассах QObject, независимо от того, используют ли они на самом деле сигналы, слоты и свойства, поскольку невыполнение этого может привести к тому, что некоторые функции будут демонстрировать странное поведение.

Редактировать: Начиная с Qt 5, функторы и лямбда-выражения можно использовать как слот.См New Signal Slot Syntax in Qt 5

8 голосов
/ 05 марта 2014

Начиная с Qt 5, функторы и лямбда-выражения можно использовать как слот (как упоминалось ранее, здесь: http://qt -project.org / wiki / New_Signal_Slot_Syntax ).

Поскольку я не смог найти пример кода, я добавил следующее:

В этом примере используется boost::function для члена класса ClassName::classMember() без параметров.

    boost::function<void()> f= boost::bind(&ClassName::classMember, classInstance);
    connect(QObjectInstance, &QObject::signalName, f);

Когда у сигнала Qt и члена класса есть параметры (например, ClassName::classMember(int)), функция повышения должна быть адаптирована следующим образом:

    boost::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1);

Более подробную информацию о boost :: bind можно найти в документации: http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html

4 голосов
/ 29 января 2013

В Qt 5 вы можете. См. http://qt -project.org / wiki / New_Signal_Slot_Syntax

В Qt 4 это напрямую не поддерживается, но есть пара библиотек, которые предоставляют эту функцию, передавая сигнал через слот в скрытом объекте QObject, который затем вызывает вашу функцию без слотов. Моя попытка этого может быть найдена в https://github.com/robertknight/qt-signal-tools. В нижней части README есть ссылки на другие реализации.

0 голосов
/ 29 марта 2012

Достаточно наследовать QObject: http://qt -project.org / doc / qt-4.8 / signalandslots.html

0 голосов
/ 29 марта 2012

Вряд ли. Qt-meta-object-compiler ( moc ) оборачивает функцию, помеченную как slot -s, в относительно большой оболочке кода. Файлы, созданные moc , начинаются с moc_ , смотрите их.

...