如何使QPushButton可按下输入键?

时间:2012-08-09 16:33:48

标签: c++ qt qpushbutton

我想让我的笔记本电脑友好。我可以在任何地方标记,但是如果我选择QPushButton我不能用 Enter 按下它,只能使用 space
有什么问题?如何使输入

4 个答案:

答案 0 :(得分:64)

TL;博士

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

    Property Editor

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


    全面审核

    概述

    每个QPushButton都有3个未继承的属性。当我们在default上放置按钮时,两个(autoDefaultQDialog)起主要作用,因为这些设置(以及对其中一个按钮的关注)决定哪个按钮会如果我们点击 Enter ,则按下 默认情况下,所有这些属性都设置为false。如果按钮具有autoDefault父级,则只有QDialog才会成立。

    每按一次 space ,将按下具有焦点的按钮。以下将描述如果按 Enter 会发生什么。

    默认属性

    如果设置为true,则该按钮将是默认按钮 如果在对话框中按下 Enter ,则按下此按钮除外,当焦点位于autoDefault按钮上时。

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

    AutoDefault属性

    如果设置为true,则该按钮将是 autoDefault按钮 如果在对话框中按下 Enter ,则在焦点位于此按钮时将按下此按钮。

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

    扁平物业

    如果设置为true,则不会引发按钮的边框。

    示例表

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

    Regular, autoDefault and default buttons

    Regular and autoDefault buttons

    测试代码

    以下代码是一种向对话框添加按钮的方法。它可以通过更改boolean和/或setDefault()的{​​{1}}值来用于测试。
    您只需创建一个窗口,添加一个名为setAutoDefault()的{​​{1}}和一个名为QPushButton的{​​{1}}(这是默认命名)。不要忘记pushButton。然后将此代码复制到按钮的QLabel信号:

    label

    显示

    如果您编译代码,则可以获得此窗口。您甚至不必单击按钮,因为操作系统呈现它们的方式显示如果您按 Enter space 将按下哪一个。

    OS rendered buttons

    官方文件

    大多数答案都是根据官方文件做出的 Qt提出的QPushButton documentation说明了这些:

      

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

         

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

         

    在对话框中,一次只能有一个按钮可以作为默认按钮。   然后显示该按钮带有一个额外的框架(取决于   GUI风格)。

         

    默认按钮行为仅在对话框中提供。按钮可以   当按下空格键时,总是从键盘上单击   按钮有焦点。

         

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

    还值得检查QDialogQMessageBox

答案 1 :(得分:2)

根据Qt的文档,输入应该正常工作

  

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

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

答案 2 :(得分:1)

totymedli的答案很棒。我添加了一个小程序来测试isDefault,autoDefault,setDefault和setAutoDefault函数的各种组合。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Window(QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        autoDefaultInitialState = True
        defaultInitialState = False

        self.lineEdit1 = QLineEdit(self)
        self.lineEdit2 = QLineEdit(self)
        self.lineEdit3 = QLineEdit(self)

        # if we create a new button (e.g. "Print state"), with the same function,
        # it doesn't work, because adding a new button (apart from our 3 buttons)
        # produces total mess, so we use this lineedit for this purpose
        self.lineEdit1.returnPressed.connect(self.printState)

        #------------------------------------

        self.chkAutoDefaultOk = QCheckBox('OK setAutoDefault', self)
        self.chkAutoDefaultCancel = QCheckBox('Cancel setAutoDefault', self)
        self.chkAutoDefaultApply = QCheckBox('Apply setAutoDefault', self)

        self.chkDefaultOk = QCheckBox('OK setDefault', self)
        self.chkDefaultCancel = QCheckBox('Cancel setDefault', self)
        self.chkDefaultApply = QCheckBox('Apply setDefault', self)

        self.chkAutoDefaultOk.setChecked(autoDefaultInitialState)
        self.chkAutoDefaultCancel.setChecked(autoDefaultInitialState)
        self.chkAutoDefaultApply.setChecked(autoDefaultInitialState)

        self.chkDefaultOk.setChecked(defaultInitialState)
        self.chkDefaultCancel.setChecked(defaultInitialState)
        self.chkDefaultApply.setChecked(defaultInitialState)

        #------------------------------------

        self.pushButtonOk = QPushButton(self)
        self.pushButtonOk.setText("Ok")
        self.pushButtonOk.clicked.connect(lambda : print('ok'))

        self.pushButtonCancel = QPushButton(self)
        self.pushButtonCancel.setText("Cancel")
        self.pushButtonCancel.clicked.connect(lambda : print('cancel'))

        self.pushButtonApply = QPushButton(self)
        self.pushButtonApply.setText("Apply")
        self.pushButtonApply.clicked.connect(lambda : print('apply'))

        #------------------------------------

        self.pushButtonOk.setAutoDefault(autoDefaultInitialState)
        self.pushButtonCancel.setAutoDefault(autoDefaultInitialState)
        self.pushButtonApply.setAutoDefault(autoDefaultInitialState)

        self.pushButtonOk.setDefault(defaultInitialState)
        self.pushButtonCancel.setDefault(defaultInitialState)
        self.pushButtonApply.setDefault(defaultInitialState)

        #------------------------------------

        self.chkAutoDefaultOk.stateChanged.connect(self.chkChangeState)
        self.chkAutoDefaultCancel.stateChanged.connect(self.chkChangeState)
        self.chkAutoDefaultApply.stateChanged.connect(self.chkChangeState)

        self.chkDefaultOk.stateChanged.connect(self.chkChangeState)
        self.chkDefaultCancel.stateChanged.connect(self.chkChangeState)
        self.chkDefaultApply.stateChanged.connect(self.chkChangeState)

        #------------------------------------

        self.layout = QGridLayout(self)
        self.layout.addWidget(self.lineEdit1, 0, 0, 1, 3)
        self.layout.addWidget(self.lineEdit2, 1, 0, 1, 3)
        self.layout.addWidget(self.lineEdit3, 2, 0, 1, 3)

        self.layout.addWidget(self.chkAutoDefaultOk, 3, 0)
        self.layout.addWidget(self.chkAutoDefaultCancel, 3, 1)
        self.layout.addWidget(self.chkAutoDefaultApply, 3, 2)

        self.layout.addWidget(self.chkDefaultOk, 4, 0)
        self.layout.addWidget(self.chkDefaultCancel, 4, 1)
        self.layout.addWidget(self.chkDefaultApply, 4, 2)

        self.layout.addWidget(self.pushButtonOk, 5, 0)
        self.layout.addWidget(self.pushButtonCancel, 5, 1)
        self.layout.addWidget(self.pushButtonApply, 5, 2)

    def chkChangeState(self):
        obj = self.sender()
        if (obj == self.chkAutoDefaultOk):
            self.pushButtonOk.setAutoDefault(self.chkAutoDefaultOk.isChecked())
        elif (obj == self.chkAutoDefaultCancel):
            self.pushButtonCancel.setAutoDefault(self.chkAutoDefaultCancel.isChecked())
        elif (obj == self.chkAutoDefaultApply):
            self.pushButtonApply.setAutoDefault(self.chkAutoDefaultApply.isChecked())
        elif (obj == self.chkDefaultOk):
            self.pushButtonOk.setDefault(self.chkDefaultOk.isChecked())
        elif (obj == self.chkDefaultCancel):
            self.pushButtonCancel.setDefault(self.chkDefaultCancel.isChecked())
        elif (obj == self.chkDefaultApply):
            #print('sender: self.chkDefaultApply')
            #print('before: ', self.pushButtonApply.isDefault())
            self.pushButtonApply.setDefault(self.chkDefaultApply.isChecked())
            #print('after: ', self.pushButtonApply.isDefault())

    def printState(self):
        print(self.pushButtonOk.autoDefault(), self.pushButtonCancel.autoDefault(), self.pushButtonApply.autoDefault())
        print(self.pushButtonOk.isDefault(), self.pushButtonCancel.isDefault(), self.pushButtonApply.isDefault())
        print('-' * 50)

app = QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())

答案 3 :(得分:-2)

设置小部件的Tab键顺序。这将允许使用返回键进行单击。它在Qt中默认存在。