Qt:在发出信号之前发出消息

Qt: Issuing a message before emitting a signal

简要描述我的申请和我的问题:

在 QTabWidget 中,我有几个 groupBox,每一个包含 2 个 QRadioButton。 例如。 Select 菜单 (groupBox): (RadioButton:) A (RadioButton:) B

在一个时间点,只能激活一个菜单。 两个单选按钮相互连接 -> 当我单击 radioButton A 并将其设置为 true 时,radioButton B 会自动设置为 false - 反之亦然。

尝试更改菜单设置时,在发出点击信号之前,我想发出 QMessageBox 警告 "Are you sure you want to change the menu? This can cause severe damage to your device." -Yes/No.

单击“是”时,我想更改菜单设置。单击“否”时,我希望一切都保持原样。

我遇到的唯一问题是:在 on_radio_button_toggled 槽中发出 QMessageBox 时,radioButton 状态已经变为 true。 即使我再次更改插槽中的状态并更正它们,当弹出消息出现时看起来状态已经改变了。我不想这样,因为这意味着菜单的状态已经改变。

在发出实际信号槽之前,在何处或如何让 QMessageBox 弹出 - 当单击单选按钮时?

非常感谢您的帮助。

更新: 我现在已经按照建议实施了一个 eventFilter。这是我的源代码:

ui->radioButtonMenu1->installEventFilter(this);
ui->radioButtonMenu2->installEventFilter(this);

SubmenuOne 是一个 QWidget。它通过 QTabWidget(通过占位符)集成到 MainWindow 中。

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); 在 window 中声明事件过滤器,然后将事件过滤器安装到每个单选按钮,如下所示:radioButton1->installEventFilter(this);。然后在 eventFilter 检查事件类型:if (event->type() == QEvent::MouseButtonPress) 并显示你的 QMessageBox。然后你可以接受事件和 return truefalse 取决于用户选择。

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.
}