2016-01-07 6 views
0

Краткого описания моего приложения и моим вопроса: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; 
} 

} 
} 

ответ

0

Вы должны использовать фильтр событий bool eventFilter(QObject *obj, QEvent *event); Declare в окне, а затем вселить фильтр событий для каждого радиокнопки, как это: radioButton1->installEventFilter(this);. Затем в eventFilter проверьте тип события: if (event->type() == QEvent::MouseButtonPress) и покажите QMessageBox. Затем вы можете принять событие и вернуть true или false в зависимости от выбора пользователя.

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) 
    { 
     static_cast<QRadioButton*>(obj)->setChecked(True); 
    } 
    event->accepted(); 
    return true; 
    } 
    return QMainWindow::eventFilter(obj, event); //you forget this. QMainWindow is just base class of your SubmenuOne. 
} 
+0

У меня есть один оставшийся вопрос. Я установил фильтр на радиокнопки и написал функцию eventFilter. Но если я нажму «Да», значение еще не изменится. Я застрял. Как я могу подключить логическое возвращаемое значение этой функции к radioButton? Большое вам спасибо за вашу помощь. – Havefun

+0

Когда вы возвращаете 'true', это означает, что событие фильтруется. Когда вы возвращаете событие «false», которое не отфильтровано, значит, переключатель изменит состояние. Для получения дополнительной информации о фильтрации событий прочитайте документацию Qt – Evgeny

+0

Я до сих пор не нашел решения для этого. Я читал классы QObject и QEvent в дуплировании более одного раза, но не смог проследить свою ошибку. Теперь, когда я нажимаю YES, radioButton отмечен синим цветом, но он не установлен. Если я нажму «Нет», он не будет помечен. Это означает, что мой eventFilter работает правильно; но все же mouseClick не запускает слот radioBox. Какая загадка. Я использую функции accept() в eventFilter. Кто-нибудь подскажет? – Havefun