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 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.
}
简要描述我的申请和我的问题:
在 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 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.
}