Qt5 QMessageBox 无法在按钮之间切换

Qt5 QMessageBox cannot tab between buttons

提问人:NuclearPeon 提问时间:3/24/2020 更新时间:8/16/2022 访问量:324

问:

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

键 like 和 工作正常,但 、 和 键不执行任何操作。我希望按下这些键会将焦点从一个按钮切换到另一个按钮,或者如果 ,将充当 .EscapeEnterTabSpaceLeftRightSpaceEnter


我认为这将是默认行为或易于实现,但我没有看到它。我宁愿不 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 获得预期的效果,所以我会做更多的测试。它可能特定于我的平台。

QT5 Focus 按键 OSX-Snow-Leopard QMessomboxBox

评论

1赞 Vladimir Bershov 3/24/2020
在Windows 7上的Qt 5.14.1上正常工作
1赞 Vladimir Bershov 3/24/2020
似乎在这里得到了答案 stackoverflow.com/a/32378759/4149835
0赞 NuclearPeon 3/25/2020
@VladimirBershov我遍历了列表以设置焦点结构,这解决了空格键不起作用的问题,但箭头和 Tab 键仍然不起作用。我认为这可能是 Qt 5.3.2 中的一个错误,所以我可能会尝试在那里寻找。感谢您的帮助!msgBox.buttons()Qt::TabFocus

答:

0赞 NuclearPeon 3/25/2020 #1

感谢@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 需要对按钮本身采取强焦点策略才能获得此功能。

编辑

将焦点策略设置为强焦点确实有效,但这不是 Mac OS X 的预期使用方式。不久前我读了一篇博客,其中提到您需要进入:

System Settings -> Keyboard -> Keyboard Shortcuts tab

然后在底部,应该有一个部分,使您能够在“仅文本框和列表”(默认)或“所有控件”之间移动键盘选项卡焦点。设置为“全部控制”意味着 QT 可以在 OS X 中正确使用其默认焦点策略。Full Keyboard Access