Использование любой функции С++ в качестве слота Qt

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

Ответ 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 _, смотрите их.