Qt — изменить параметр слота предыдущего подключенного сигнала с помощью лямбда-функции

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

Сначала я попробовал что-то вроде этого:

connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varA);});
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varB);});

function1 получает varA и никогда varB,

Я нашел способ сделать это, сохранив список соединений, и когда я хотел изменить параметр, я просто отключил старое и установил новое соединение.

То, что я хотел бы знать, есть ли способ сделать это изменение без необходимости отслеживать все соединения и проходить процесс discconnect / connect.

1

Решение

Мне приходят на ум два решения:

  1. Захватить var по ссылке и измените его вместо повторного подключения:

    class Foo : public QWidget {
    Q_OBJECT
    int remove_btn_var;
    int varA = 10, varB = 20;
    QPushButton remove_btn;
    void function1(int);
    public:
    Foo() {
    remove_btn_var = varA;
    connect(&remove_btn, &QPushButton::clicked, [&] { function1(remove_btn_var); });
    }
    void switch() {
    remove_btn_var = varB;
    }
    };
    
  2. Добавьте к кнопке свойство, которое вы можете изменить:

    static const char k_function1_var[] = "function1_var";
    class Foo : public QWidget {
    Q_OBJECT
    int varA, varB;
    QPushButton remove_btn;
    void function1(int);
    public:
    Foo() {
    remove_btn.setProperty(k_function1_var, varA);
    connect(&remove_btn, &QPushButton::clicked, [this] {
    function1(remove_btn.property(k_function1_var).toInt())
    });
    }
    void switch() {
    remove_btn.setProperty(k_function1_var, varB);
    }
    };
    
0

Другие решения

Вы могли бы использовать std::bind, так как QPushButton::clicked сигнал имеет 1 параметр (bool checked) должно быть достаточно для использования:

auto f = std::bind(function1, varA); // checked argument ignored (std::placeholders::_1)
connect(remove_btn,&QPushButton::clicked,f);
0

По вопросам рекламы [email protected]