我的应用程序和问题的简要描述:
在一个QTabWidget中,我有几个groupBoxes,每个包含2个QRadioButton。例如。选择菜单(分组框):(单选按钮:)A(单选按钮)B
在一个时间点上,只有一个菜单可以处于活动状态。两个单选按钮相互连接->当我点击单选按钮A并将其设置为true时,单选按钮B会自动设置为false,反之亦然。
当尝试更改菜单设置时,在发出点击信号之前,我想发出Q MessageBox警告"您确定要更改菜单吗?这可能会对您的设备造成严重损坏。"-是/否。
单击"是"时,我想更改菜单设置。单击"否"时,我希望一切保持原样。
我唯一的问题是:当在on_radio_button_ggled插槽中发出QMessageBox时,radioButton状态已经更改为true。即使我再次更改插槽中的状态并更正它们,当弹出消息显示时,状态似乎已经更改。我不想这样,因为这意味着菜单的状态已经改变了。
点击单选按钮时,在发出实际信号槽之前,我在哪里或如何让QMessageBox弹出?
非常感谢你的帮助。
更新:我现在已经按照建议实现了eventFilter。这是我的源代码:
ui->radioButtonMenu1->installEventFilter(this);
ui->radioButtonMenu2->installEventFilter(this);
SubmenuOne是一个QWidget。它通过QTabWidget(通过占位符)集成到主窗口中。
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;
}
}
}
您必须使用bool eventFilter(QObject *obj, QEvent *event);
在窗口中声明事件过滤器,然后将事件过滤器安装到每个单选按钮,如下所示: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.
}