qt5 - Qt5 QMessageBox 不能在按钮之间制表符
问题描述
我有一些代码可以调出QMessageBox
,但是当它提示时,我无法在按钮之间切换。它卡在默认按钮上。
likeEscape
和键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 需要对按钮本身有很强的关注策略才能获得此功能。
推荐阅读
- ibm-midrange - iSeries/AS400 渐进式部署
- javascript - date-fns 和 react - while 循环在检查给定的 if 语句条件后增加了 1 天
- command-line - 如何在 ls 命令的 cshell 别名中使用星号?
- javascript - 如何将数组方法(反向和连接)应用于此字符串
- php - 如何使用 Timber 在页脚中显示 3 个最近的帖子?
- python-3.x - python-3x 中的相对导入
- sas - SAS中的Proc转置,var变量中有多个观察值
- c# - 使用 lastwritetime 从 FTP 复制文件
- android - 每次创建 Fragment 时,来自 Dao 的 LiveData 都会触发 onChanged
- c++ - Visual Studio 2019 CMake 项目 Linux 远程构建器将源和输出文件放在目标设备上的什么位置?