Краткого описания моего приложения и моим вопроса:Qt: Выдача сообщения перед излучающим сигналом
В QTabWidget У меня есть несколько рамок группы, содержащей каждые 2 QRadioButtons. . Выберите Меню (groupBox): (RadioButton :) A (RadioButton :) B
В какой-то момент может быть активным только одно меню. Оба переключателя радиосвязи подключены к каждому из них -> Когда я нажимаю radioButton A и устанавливаю его true, radioButton B автоматически устанавливается false - и наоборот.
При попытке изменить настройку меню перед выдачей сигнала щелчка я хотел бы отправить предупреждение QMessageBox «Вы уверены, что хотите изменить меню? Это может нанести серьезный урон вашему устройству». -Да нет.
При нажатии «Да» я хотел бы изменить настройку меню. Когда вы нажимаете «Нет», я бы хотел, чтобы все оставалось прежним.
Единственная проблема, с которой я столкнулся: при выпуске QMessageBox в слоте on_radio_button_toggled состояние radioButton уже изменилось на true. Даже если я снова изменю состояние в слоте и исправлю их, похоже, что состояние уже изменилось при появлении всплывающего сообщения. Я не хочу этого, потому что это означает, что состояние меню уже изменилось.
Где и как я могу позволить QMessageBox всплывать перед тем, как испускать фактический слот сигнала - при нажатии кнопки радио?
Большое спасибо за помощь.
Обновление: В настоящее время я внедрил eventFilter, как рекомендовано. Вот мой исходный код:
ui->radioButtonMenu1->installEventFilter(this);
ui->radioButtonMenu2->installEventFilter(this);
ПодменюOne - это QWidget. Он интегрирован в MainWindow с помощью QTabWidget (через placeholder).
bool SubmenuOne::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMessageBox::StandardButton reply;
reply= QMessageBox::question(this,tr("WARNING"),tr("Changing the settings may cause severe damage to your device! Please confirm your decision."),QMessageBox::Yes|QMessageBox::No);
if (reply == QMessageBox::Yes)
{
//QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
//keyEvent->accept();
//event->accept();
qDebug("Yes.");
return false;
}
else
{
qDebug("No.");
return true;
}
}
}
У меня есть один оставшийся вопрос. Я установил фильтр на радиокнопки и написал функцию eventFilter. Но если я нажму «Да», значение еще не изменится. Я застрял. Как я могу подключить логическое возвращаемое значение этой функции к radioButton? Большое вам спасибо за вашу помощь. – Havefun
Когда вы возвращаете 'true', это означает, что событие фильтруется. Когда вы возвращаете событие «false», которое не отфильтровано, значит, переключатель изменит состояние. Для получения дополнительной информации о фильтрации событий прочитайте документацию Qt – Evgeny
Я до сих пор не нашел решения для этого. Я читал классы QObject и QEvent в дуплировании более одного раза, но не смог проследить свою ошибку. Теперь, когда я нажимаю YES, radioButton отмечен синим цветом, но он не установлен. Если я нажму «Нет», он не будет помечен. Это означает, что мой eventFilter работает правильно; но все же mouseClick не запускает слот radioBox. Какая загадка. Я использую функции accept() в eventFilter. Кто-нибудь подскажет? – Havefun