首页 > 解决方案 > Qt5 QMessageBox 不能在按钮之间制表符

问题描述

我有一些代码可以调出QMessageBox,但是当它提示时,我无法在按钮之间切换。它卡在默认按钮上。

likeEscape和键Enter可以正常工作,但是Tab,SpaceLeftRight键什么都不做。我想要它,所以按下这些键会将焦点从一个按钮更改为另一个按钮,或者如果Space,将充当Enter


我认为这将是默认行为或易于实现,但我没有看到它。我不希望 a) 构建我自己的 ui 表单,或者 b) 构建一个复杂的 keyPressEvent 函数,但也许这就是我要坚持的。

使用 Qt 5.3.2,使用 qt-creator 3.1.2 和 3.0.1,Mac OS X 10.6.8。

    QMessageBox msgBox;
    msgBox.setWindowTitle("This is a prompt");
    msgBox.setIcon(QMessageBox::Question);
    msgBox.layout()->setSizeConstraint(QLayout::SetMaximumSize);
    msgBox.setText(tr("This is some text"));
    msgBox.setInformativeText(tr("Here is some great information for you.\n"));
    msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    msgBox.setDefaultButton(QMessageBox::No);
    msgBox.setBaseSize(QSize(400, 160));
    msgBox.setFocusPolicy(Qt::StrongFocus);
    int ret = msgBox.exec();

我试过使用setFocusPolicy(Qt::StrongFocus);,但这没有帮助。

我能够在 Linux 上从 Qt 5.14.1 + qtcreator 4.10.1 得到想要的效果,所以我会做更多的测试。它可能特定于我的平台。

标签: qt5focuskeypressosx-snow-leopardqmessagebox

解决方案


感谢@VladimirBershov 和https://stackoverflow.com/a/32378759/4149835上的回答帮助我度过了难关。

以前我调用setFocusPolicy(Qt::StrongFocus)了消息框对象本身,但我这样做了:

QMessageBox msgBox;
msgBox.setWindowTitle("This is a prompt");
msgBox.setIcon(QMessageBox::Question);
msgBox.layout()->setSizeConstraint(QLayout::SetMaximumSize);
msgBox.setText(tr("This is some text"));
msgBox.setInformativeText(tr("Here is some great information for you.\n"));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No);
msgBox.setBaseSize(QSize(400, 160));
QList<QAbstractButton *> bList = msgBox.buttons();
for (int i=0; i<bList.count(); i++)
{
    bList.at(i)->setFocusPolicy(Qt::StrongFocus);
}
int ret = msgBox.exec();

这解决了它!Mac OS X 10.6.8 需要对按钮本身有很强的关注策略才能获得此功能。


推荐阅读