如何使 QPushButton 可按下回车键?

新手上路,请多包涵

我想让我的应用程序对笔记本电脑友好。我可以在任何地方使用选项卡,但是如果我使用 QPushButton 选项卡,我不能使用 Enter 按下它,只能使用 空格 键。

有什么问题?如何使其可按下 Enter

原文由 totymedli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

tl;博士

  1. 在 Qt Creator 的 UI 视图中,为 Enter 选择要使其可按下的按钮。
  2. 在属性编辑器的右侧,向下滚动到标题为 QPushButton 的蓝色部分。
  3. 通过 autoDefaultdefault 选中复选框。

属性编辑器

大多数情况下, autoDefaultdefault 之间的主要区别在于按钮的呈现方式。但在某些情况下,它可能会导致意想不到的事情,因此有关更多信息,请阅读下文。


全面审查

概述

每个 QPushButton 都有 3 个未继承的属性。从这些中,当我们将按钮放在 QDialog s 上时,两个( defaultautoDefault )具有主要作用,因为这些设置(以及关注其中一个button) 决定如果我们按 Enter 将按下哪个按钮。

默认情况下,所有这些属性都设置为 false。唯一的期望是 autoDefault 如果按钮有一个 QDialog 父级,那将是真的。

每次您按 空格 键时,将按下焦点在它上面的按钮。下面将描述如果按 Enter 会发生什么。

默认属性

如果设置为 true,则该按钮将是 _默认按钮_。

如果在对话框上按下 Enter ,则将按下此按钮,除非焦点位于自动默认按钮上。

应该只有一个默认按钮。如果您添加更多,那么最后添加的将是默认按钮。

自动默认属性

如果设置为 true,则该按钮将是一个 autoDefault button

如果在对话框上按下 Enter 键,那么如果焦点在它上面,则会按下此按钮。

如果焦点不在自动默认按钮上并且没有默认按钮,则将为 Enter 按下下一个自动默认按钮。

平房

如果设置为 true,那么按钮的边框将不会被提升。

示例表

下表显示了在不同焦点上使用不同按钮将按下哪个按钮。按钮是从左到右添加的。

常规、自动默认和默认按钮

常规和自动默认按钮

测试代码

以下代码是一种向对话框添加按钮的方法。它可用于通过更改 booleansetDefault() 和/或 setAutoDefault() 来进行测试。

You just need to create a window, add a QPushButton called pushButton and a QLabel called label (that is the default naming).不要忘记 #include <QMessageBox> 。然后将此代码复制到按钮的 clicked() 信号:

 void MainWindow::on_pushButton_clicked()
{
   QMessageBox msgBox;

   QPushButton button("Button");
   button.setDefault(false);
   button.setAutoDefault(false);
   msgBox.addButton(&button, QMessageBox::ActionRole);

   QPushButton autodefaultbutton("AutoDefault Button");
   autodefaultbutton.setDefault(false);
   autodefaultbutton.setAutoDefault(true);
   msgBox.addButton(&autodefaultbutton, QMessageBox::ActionRole);

   QPushButton autodefaultbutton2("AutoDefault Button2");
   autodefaultbutton2.setDefault(false);
   autodefaultbutton2.setAutoDefault(true);
   msgBox.addButton(&autodefaultbutton2, QMessageBox::ActionRole);

   QPushButton defaultbutton("Default Button");
   defaultbutton.setDefault(true);
   defaultbutton.setAutoDefault(false);
   msgBox.addButton(&defaultbutton, QMessageBox::ActionRole);

   msgBox.exec();

   if (msgBox.clickedButton() == &button) {
      ui->label->setText("Button");
   } else if (msgBox.clickedButton() == &defaultbutton) {
      ui->label->setText("Default Button");
   } else if (msgBox.clickedButton() == &autodefaultbutton) {
      ui->label->setText("AutoDefault Button");
   } else if (msgBox.clickedButton() == &autodefaultbutton2) {
      ui->label->setText("AutoDefault Button2");
   }
}

展示

如果你编译代码,你可以得到这个窗口。您甚至不必单击按钮,因为操作系统呈现它们的方式显示了如果您按 Enter空格 将按下哪个按钮。

操作系统呈现的按钮

官方文档

这个答案大部分是根据官方文档做出的。

Qt 制作的 QPushButton 文档说明 了这些:

默认和自动默认按钮决定当用户在对话框中按下回车时会发生什么。

当用户按下回车键时,将自动按下此属性设置为 true 的按钮(即对话框的默认按钮),但有一个例外:如果 autoDefault 按钮当前具有焦点,则按下 autoDefault 按钮。当对话框有 autoDefault 按钮但没有默认按钮时,按 enter 将按下当前具有焦点的 autoDefault 按钮,或者如果没有按钮具有焦点,则按下焦点链中的下一个 autoDefault 按钮。

在对话框中,一次只能有一个按钮作为默认按钮。然后,此按钮会显示一个附加框架(取决于 GUI 样式)。

默认按钮行为仅在对话框中提供。当按钮具有焦点时,始终可以通过按空格键从键盘单击按钮。

如果对话框可见时当前默认按钮的默认属性设置为 false,则下次对话框中的按钮获得焦点时将自动分配新的默认值。

检查 QDialogQMessageBox 也是值得的。

原文由 totymedli 发布,翻译遵循 CC BY-SA 3.0 许可协议

根据 Qt 的文档 Enter 应该可以工作

默认情况下,对话框中的命令按钮是自动默认按钮,即当它们接收到键盘输入焦点时,它们会自动成为默认按钮。默认按钮是当用户在对话框中按下 Enter 或 Return 键时激活的按钮。您可以使用 setAutoDefault() 更改此设置。

http://qt-project.org/doc/qt-4.8/qpushbutton.html

原文由 Amxx 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题