gpt4 book ai didi

c++ - 如何在静态单例类中以编程方式从 exec 方法返回

转载 作者:行者123 更新时间:2023-11-28 07:50:48 25 4
gpt4 key购买 nike

我正在 SBC6000x 板上开发 Qt 应用程序(Qt 版本 4.7.3)。

我有一个派生自 QDialog 的 MessageBox 类。我已经将这个类设为单例。

每当要显示消息框时,我都会使用 .exec 方法来显示它。

很少有地方需要一个接一个地显示消息框。

所以,要显示新的消息框,我必须关闭前一个并显示新的。

例如当消息框打开时,同时我从后台收到错误消息,我必须关闭当前显示的消息框并显示有错误的消息框。

为了关闭之前的对话框,我从消息框类中公开了 CloseDlg 方法并尝试关闭它。

在这个 CloseDlg 中,我正在发出完成信号。

void CMsgBox::CloseDlg()
{
if (NULL != CMsgBox::m_msgBox)
{
if(CMsgBox::m_msgBox->isVisible())
{
emit CMsgBox::m_msgBox->finished(0);
//QApplication::processEvents();
}
}
}

并将其称为

CMsgBox::CloseDlg();

我的展示方法是:-

int CMsgBox::showMsgBox(Icon icon, const QString &textMsg, const QString &okBtnText)
{
if (CMsgBox::m_msgBox == NULL)
{
CMsgBox::m_msgBox = new CMsgBox();
}
CMsgBox::m_msgBox->setText(textMsg);
CMsgBox::m_msgBox->setIcon(icon);
CMsgBox::m_msgBox->setOkBtnText(okBtnText);
CMsgBox::m_msgBox->exec();

return CMsgBox::m_msgBox->m_btnPressed; //return, unblock the call
}

当我再次调用 showMsgBox 时,它向我显示以下警告。QDialog::exec:检测到递归调用

问题是,它不会从之前的 exec 调用返回(除非我们返回,如上面的注释//)。

我尝试使用 close()、accept()、reject() 方法代替 finished() 事件,但没有任何效果。

从之前的 exe 调用返回并实现上述场景的方法是什么?欢迎任何帮助。

最佳答案

这里的内容看起来像是竞争条件。模态 QDialog 运行自己的事件循环,因此您的应用程序的行为类似于多线程应用程序,您需要注意并发性和竞争条件。

当您在主事件循环中收到第二个事件时,您会快速连续调用 CMsgBox::CloseDlg()CMsgBox::showMsgBox()。然而,CloseDlg() 告诉对话框的事件循环返回,但 CloseDlg() 实际上在对话框的事件循环完成清理之前返回,并且 showMsgBox() 尝试在尚未完成退出的对话框上调用 exec()

你需要做的是,当你调用 CMsgBox::CloseDlg() 时,连接到 finished(int) 信号,并且只有当你收到 finished(int) 你能安全地再次 exec() 对话框吗?

注意:连接到 finished(int) 信号时,确保使用 Qt::QueuedConnection 而不是 Qt::DirectConnection 这是默认值。

关于c++ - 如何在静态单例类中以编程方式从 exec 方法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com