如何禁用 Qt QMessageBox 播放的声音?

Posted

技术标签:

【中文标题】如何禁用 Qt QMessageBox 播放的声音?【英文标题】:How can I disable sounds played by Qt QMessageBox? 【发布时间】:2013-04-17 20:49:35 【问题描述】:

我正在使用 Qt 4.8 开发一个使用

的 Windows 应用程序
QMessageBox::information
QMessageBox::warning
...

当调用这些函数中的任何一个时,windows 默认播放声音。我的客户对此感到恼火,并希望在不更改 Windows 设置的情况下永久禁用此功能。

如果出现这种声音,我该如何消除?

我发现它是从

void QAccessible::updateAccessibility()

但我目前还没有找到禁用它的方法。

【问题讨论】:

我认为这是一个 Windows 功能。 不,声音是从 Qt 主动调用的。 我不这么认为,QMessageBox 根本没有提到声音,而且我很确定 QMessageBox 上没有声音,因为我禁用了 Windows 声音方案。 我在调试器中单步调试了源代码。声音在void QAccessible::updateAccessibility()中播放 在他们的文档中 QAccessible 中有一个 SoundPlayed 组件。至于消息框,我知道 QMessageBox 的静态方法调用会发出声音的原生消息框。尝试制作一个 QMessageBox 消息,使用它的属性设置它,然后在该对象上调用 .exec() 。据说可以有不同的音频结果。可能值得一试。 【参考方案1】:

如果您使用不同的QMessageBoxQMessageBox::about,或创建自己的QMessageBox 实例并自己设置iconPixmap 和所有内容,则不应听到哔哔声。

QMessageBox::warning(0, "Test", "test"); // Plays alert

QMessageBox::about(0, "Test", "test"); // No sound, but no icon either

QMessageBox msgBox;
msgBox.setParent(0);
msgBox.setWindowTitle("Test");
msgBox.setText("test");
if(false)

    msgBox.setIcon(QMessageBox::Warning);// makes sound

else

    QPixmap p;
    p.load("warning.png");
    msgBox.setIconPixmap(p);// no sound, but with icon

msgBox.exec();

否则,要禁用警告声音,您可能需要在您的应用上使用global event filter 来捕捉来自QAccessibility 的任何事件/消息,角色为QAccessible::AlertMessage

希望对您有所帮助。

【讨论】:

您还需要调用 msgBox.setStandardButtons(QMessageBox::Ok); 之类的方法来显示消息框。

以上是关于如何禁用 Qt QMessageBox 播放的声音?的主要内容,如果未能解决你的问题,请参考以下文章

Qt下QMessageBox的问题

Qt:如何在不阻塞主线程的情况下播放声音?

如何在 Qt5 中播放声音(Qt4 迁移)?

如何在 QT 虚拟键盘上按下信号键并播放声音点击轨道?

如何在Ubuntu启动时禁用声音效果?

如何从 Qt 中的资源文件中重复/循环声音?