Qt связь QSlider-а с двумя разными виджетами в одном connect-е с помощью QStackedWidget

Подскажите пожалуйста, есть два виджета запушеных в QStackedWidget, если слота называются одинаково можно ли их так законектить:

connect(dial, SIGNAL(valueChange(int)), stackedwgt->currentWidget(), SLOT(slot(int)));

Я так сделал и на первый виджет все работает, а на второй нет.

Как сделать что бы при смене currentWidget-а все работало?


Ответы (2 шт):

Автор решения: Alexander Chernin

Можно. Нужно сделать так:

// Например в конструкторе
// CustomWidget это ваш виджет, если у вас их много, то код немного усложнится, но 
// принцип будет тот же
// [&](){} - лямбда-слот
    connect(ui->stackedWidget, &QStackedWidget::currentChanged, [&](int index) {
        CustomWidget* w = dynamic_cast<CustomWidget*>(ui->stackedWidget->currentWidget());
        if( w != nullptr ) {
            // ... это ваши управляющие виджеты с соответствующими сигналами
            connect(..., w, &CustomWidget::slot1, Qt::UniqueConnection);
            connect(..., w, &CustomWidget::slot2, Qt::UniqueConnection);
            // ...
            connect(..., w, &CustomWidget::slotN, Qt::UniqueConnection);
        };
    });

Таким образом, вы пересоедините все ваши управляющие виджеты с виджетами в стеке. Флаг Qt::UniqueConnection предотвратит множественные соединения одних и тот же сигналов с теми же слотами, и будет только одно соединение.

Можно добавить отсоединение от предыдущего (уже не активного) виджета через хранение указателя на предыдущий виджет, сути не меняет.

Можно просто в том же конструкторе соединить все ваши управляющие виджеты со стековыми.

→ Ссылка
Автор решения: Roman Ozhegov

Я бы предложил такое решение

connect(ui->dial, &QDial::valueChanged, [=](int i){
    qobject_cast<CustomWidget*>(stackedwgt->currentWidget())->slot(i);
});

CustomWidget* - это Ваш родительский класс виджета, от которого должны быть унаследованы все вкладки. И этот класс должен иметь виртуальный метод slot(int i).

→ Ссылка