我有一些代码可以调出QMessageBox
,但当它提示时,我无法在按钮之间切换。它卡在默认按钮上。
像Escape
和Enter
这样的键工作得很好,但Tab
、Space
、Left
和Right
键什么都不做。我想要它,这样按下这些键可以将焦点从一个按钮更改为另一个按钮,或者如果Space
,则将充当Enter
。
我认为这将是默认行为或实现起来很简单,但我看不到。我宁愿不a(构建自己的ui表单,也不b(构建复杂的keyPressEvent函数,但也许这就是我要坚持的。
使用Qt 5.3.2,使用Qt创建者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
然后在底部,应该有一个Full Keyboard Access
部分,它使您能够在"one_answers"之间移动键盘选项卡焦点;仅文本框和列表";(默认(,或";所有控件";。设置为All Control意味着QT可以在OS X上正确使用其默认焦点策略。