Qt связь QSlider-а с двумя разными виджетами в одном connect-е с помощью QStackedWidget
Подскажите пожалуйста, есть два виджета запушеных в QStackedWidget, если слота называются одинаково можно ли их так законектить:
connect(dial, SIGNAL(valueChange(int)), stackedwgt->currentWidget(), SLOT(slot(int)));
Я так сделал и на первый виджет все работает, а на второй нет.
Как сделать что бы при смене currentWidget-а все работало?
Ответы (2 шт):
Можно. Нужно сделать так:
// Например в конструкторе
// 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 предотвратит множественные соединения одних и тот же сигналов с теми же слотами, и будет только одно соединение.
Можно добавить отсоединение от предыдущего (уже не активного) виджета через хранение указателя на предыдущий виджет, сути не меняет.
Можно просто в том же конструкторе соединить все ваши управляющие виджеты со стековыми.
Я бы предложил такое решение
connect(ui->dial, &QDial::valueChanged, [=](int i){
qobject_cast<CustomWidget*>(stackedwgt->currentWidget())->slot(i);
});
CustomWidget* - это Ваш родительский класс виджета, от которого должны быть унаследованы все вкладки. И этот класс должен иметь виртуальный метод slot(int i).