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



我的应用程序和问题的简要描述:

在一个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。然后您可以接受事件并根据用户选择返回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.
}

相关内容

  • 没有找到相关文章

最新更新