Есть ли способ использовать любую С++-функцию в качестве слота Qt, не имея своего класса, наследующего от QWidget?
Использование любой функции С++ в качестве слота Qt
Ответ 1
Вы не можете в версиях Qt < Qt 5.
Чтобы использовать сигналы/слоты, необходимо вызвать мета-объект-компилятор. Чтобы это произошло, ваш класс должен отвечать следующим требованиям:
- Наследовать от
QObject
или любого другого подкласса (например,QWidget
,QPushButton
и т.д.) - Макрос
Q_OBJECT
должен быть определен в частном разделе класса, чтобы включить функции метаобъекта, такие как слоты - Используйте ключевые слова
Qt
slots
иsignals
, чтобы объявить, какие функции должны обрабатываться метакомпилятором как слоты или сигналы
Для получения дополнительной информации проверьте соответствующие страницы документации о системе метаобъектов и сигналы и слоты
Также проверьте документацию QObject
:
Обратите внимание, что макрос
Q_OBJECT
является обязательным для любого объекта, который реализует сигналы, слоты или свойства. Вам также необходимо запустить Компилятор метаобъектов в исходном файле. Мы настоятельно рекомендуем использовать этого макроса во всех подклассах QObject независимо от того, они фактически не используют сигналы, слоты и свойства, поскольку это может привести к тому, что определенные функции проявят странное поведение.
Изменить: поскольку Qt 5, функторы и лямбда-выражения могут использоваться как слот. См. New Signal Slot Syntax in Qt 5
Ответ 2
Так как 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
Ответ 3
В Qt 5 вы можете. См. http://qt-project.org/wiki/New_Signal_Slot_Syntax
В Qt 4 это не поддерживается напрямую, но есть несколько библиотек, которые предоставляют эту функцию, проксируя сигнал через слот в скрытом QObject, который затем вызывает вашу функцию без слота. Моя попытка найти это можно в https://github.com/robertknight/qt-signal-tools. В нижней части README есть ссылки на другие реализации.
Ответ 4
Вряд ли. Компонент Qt-meta-object-compiler (moc) обертывает функцию, помечен как слот -s, в относительно большой оболочке кода. Файлы, созданные moc, начинаются с moc _, смотрите их.
Ответ 5
Достаточно наследовать QObject: http://qt-project.org/doc/qt-4.8/signalsandslots.html