C++ 如何使QPushButton可按enter键?

C++ 如何使QPushButton可按enter键?,c++,qt,qpushbutton,C++,Qt,Qpushbutton,我想让我的应用程序对笔记本电脑友好。我可以在任何地方用tab键,但如果我用tab键按a键,我就不能用Enter键,只能用空格键。 有什么问题吗?如何使其可按Enter键?根据Qt的文档,Enter键应该可以工作 对话框中的命令按钮默认为自动默认按钮,即当它们接收到键盘输入焦点时,它们自动成为默认按钮。默认按钮是当用户在对话框中按Enter或Return键时激活的按钮。您可以使用setAutoDefault更改此设置 设置小部件的选项卡顺序。这将允许使用返回键进行单击。默认情况下,它在Qt内。tl

我想让我的应用程序对笔记本电脑友好。我可以在任何地方用tab键,但如果我用tab键按a键,我就不能用Enter键,只能用空格键。
有什么问题吗?如何使其可按Enter键?

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

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


设置小部件的选项卡顺序。这将允许使用返回键进行单击。默认情况下,它在Qt内。

tl;博士 在Qt Creator的UI视图中,选择要使其可按Enter键的按钮。 在属性编辑器的右侧,向下滚动到标题为QPushButton的蓝色部分。 自动默认或默认选中复选框。 大多数情况下,“自动默认”和“默认”之间的主要区别在于按钮的渲染方式。但也有一些情况下,它可能会导致意想不到的事情,所以更多的信息,请阅读下文

全面审查 概述 每个QPushButton都有3个未继承的属性。在QDialogs上放置按钮时,有两个默认和自动默认起主要作用,因为这些设置和其中一个按钮上的焦点决定了如果按Enter键将按下哪个按钮。 默认情况下,所有这些属性都设置为false。只有expection是autoDefault,如果按钮具有QDialog父级,则该值为true

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

默认属性 如果设置为true,则该按钮将是默认按钮。 如果在对话框上按Enter键,则会按下此按钮,除非焦点位于自动默认按钮上

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

自动默认属性 如果设置为true,则该按钮将是自动默认按钮。 如果在对话框上按Enter键,则如果焦点在该按钮上,则将按下该按钮

如果焦点不在自动默认按钮上,并且没有默认按钮,则按下下一个自动默认按钮进入

房产 如果设置为true,则按钮的边框将不会升高

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

测试代码 下面的代码是一种向对话框中添加按钮的方法。可通过更改setDefault和/或setAutoDefault的布尔值进行测试。 您只需要创建一个窗口,添加一个名为pushButton的QPushButton和一个名为label的QLabel,这是默认命名。别忘了包括在内。然后将此代码复制到按钮的单击信号:

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

官方文件 大部分答案是根据官方文件作出的。 Qt所做的声明如下:

默认和自动默认按钮决定当用户 在对话框中按enter键

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

在对话框中,一次只能有一个按钮作为默认按钮。 然后,此按钮将显示一个附加帧,具体取决于 GUI风格

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

如果当前默认按钮上的默认属性设置为false 对话框可见时,将自动显示新的默认值 在对话框中的下一个按钮接收焦点时指定


这也值得一查。

托蒂梅德利的答案很好。我添加了一个小程序来测试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_())

我有一个Qt应用程序也有同样的问题,TabWidget内部的按钮可以正常工作,但外部的按钮只能使用空格键按下。在设计师单击要按下的按钮,在屏幕右侧底部的绿色区域中,有3个QpushButton n属性。只需检查默认值。
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_())