我有一些代码可以显示QMessageBox
,但是当提示时,我无法在两个按钮之间切换。它卡在默认按钮上。
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要求对按钮本身有强烈的关注策略才能获得此功能。