Произвольная функция в качестве слота в QObject::connect()

265
09 декабря 2017, 08:24

В Qt существует так называемый QGamepadManager Class который отвечает за подключение джойстика и получения с него сигналов при нажатии на кнопку или движения триггера.

GamepadMonitor::GamepadMonitor(QObject *parent)
    : QObject(parent)
    , m_gamepad(0)
{
    auto gamepads = QGamepadManager::instance()->connectedGamepads();
    if (gamepads.isEmpty()) {
        return;
    }
    m_gamepad = new QGamepad(*gamepads.begin(), this);
    connect(m_gamepad, &QGamepad::axisLeftXChanged, this, [](double value){
        qDebug() << "Left X" << value;
    });
    connect(m_gamepad, &QGamepad::axisLeftYChanged, this, [](double value){
        qDebug() << "Left Y" << value;
    });
    connect(m_gamepad, &QGamepad::buttonAChanged, this, [](double value){
        qDebug() << "Button A" << value;
    });
}

Подскажите, как вместо qDebug() << "Left X" << value; выполнить функцию и передать в нее этот value?

Answer 1

Соедините сигнал с Вашим методом таким образом (если метод не является слотом, то сделайте его таковым):

 connect(m_gamepad, SIGNAL(axisLeftXChanged(double)), minimalaladinclien, SLOT(sendJoystickAxisUpdate(double));

Как вариант можно написать так, тогда не придётся изменять класс переменной minimalaladinclien:

connect(m_gamepad, &QGamepad::axisLeftXChanged, this, [this](double value){
    minimalaladinclien->sendJoystickAxisUpdate(value);
});

Ну и способ который уже предложил @Arhad, пожалуй, самый правильный, если метод не является слотом:

connect(m_gamepad, &QGamepad::axisLeftXChanged, this, std::bind(&YourClass::sendJoystickAxisUpdate, minimalaladinclien);

Функция bind подключается с помощью include <functional>

READ ALSO
Сделать задачу на c++ [требует правки]

Сделать задачу на c++ [требует правки]

Уточнить корень уравнения x^2-x-03=0 на отрезке [1;2] с точностью Eps = 10^-5, используя метод деления отрезка пополам

199
Проблема strtok C++11

Проблема strtok C++11

Написал свою функцию split (Как, например, в Java или Python):

279
Вопрос про Winium + Jenkins

Вопрос про Winium + Jenkins

Вопрос 1: Я запускаю тесты на виртуалкеЧтобы тесты проходили на них нужно смотреть - т

264