提问人:NuclearPeon 提问时间:3/24/2020 更新时间:8/16/2022 访问量:324
Qt5 QMessageBox 无法在按钮之间切换
Qt5 QMessageBox cannot tab between buttons
问:
我有一些代码可以调出一个,但是当它出现提示时,我无法在按钮之间切换。它卡在默认按钮上。QMessageBox
键 like 和 工作正常,但 、 和 键不执行任何操作。我希望按下这些键会将焦点从一个按钮切换到另一个按钮,或者如果 ,将充当 .Escape
Enter
Tab
Space
Left
Right
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 获得预期的效果,所以我会做更多的测试。它可能特定于我的平台。
答:
感谢@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
评论
msgBox.buttons()
Qt::TabFocus