0

我的申请和我的问题的简要说明:

在 QTabWidget 中,我有几个 groupBoxes,每个 groupBoxes 包含 2 个 QRadioButtons。例如选择菜单 (groupBox): (RadioButton:) A (RadioButton:) B

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

尝试更改菜单设置时,在发出点击信号之前,我想发出 QMessageBox 警告“您确定要更改菜单吗?这可能会对您的设备造成严重损坏。” -是/否。

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

我唯一的问题是:在 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;
}

}
}
4

1 回答 1

0

您必须bool eventFilter(QObject *obj, QEvent *event);在窗口中使用 Declare 事件过滤器,然后将事件过滤器安装到每个单选按钮,如下所示radioButton1->installEventFilter(this);:然后在 eventFilter 检查事件类型:if (event->type() == QEvent::MouseButtonPress)并显示您的QMessageBox. 然后您可以接受事件并返回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.
}
于 2016-01-07T20:14:46.447 回答