防止 okay QPushButton 在按回车时接受对话框
Prevent okay QPushButton from accepting dialog on press enter
在下面的代码中,对话框的 Ok 按钮似乎始终处于焦点状态,因此当按下 enter 时,对话框被接受并关闭。我的目标是让用户在行编辑中编辑文本,然后在完成处理文本(editingFinished 信号)时允许按回车键。但是,这会触发接受对话框的“确定”按钮。有没有办法在不子类化对话框的情况下禁用它?
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
widget = QtWidgets.QWidget()
dbutton = QtWidgets.QPushButton("Show Dialog", widget)
dialog = QtWidgets.QDialog(None)
vlay = QtWidgets.QVBoxLayout(dialog)
form = QtWidgets.QFormLayout(None)
vlay.addLayout(form)
form.addRow("Text Input", QtWidgets.QLineEdit())
form.addRow("Float Input", QtWidgets.QSpinBox())
ok = QtWidgets.QPushButton("Ok")
cancel = QtWidgets.QPushButton("Cancel")
hlay = QtWidgets.QHBoxLayout()
hlay.addWidget(ok)
hlay.addWidget(cancel)
vlay.addLayout(hlay)
ok.clicked.connect(dialog.accept)
cancel.clicked.connect(dialog.reject)
dbutton.clicked.connect(dialog.exec_)
widget.show()
app.exec_()
您必须更改两个按钮上的 auto default 设置:
ok = QtWidgets.QPushButton("Ok")
ok.setAutoDefault(False)
cancel = QtWidgets.QPushButton("Cancel")
cancel.setAutoDefault(False)
在下面的代码中,对话框的 Ok 按钮似乎始终处于焦点状态,因此当按下 enter 时,对话框被接受并关闭。我的目标是让用户在行编辑中编辑文本,然后在完成处理文本(editingFinished 信号)时允许按回车键。但是,这会触发接受对话框的“确定”按钮。有没有办法在不子类化对话框的情况下禁用它?
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
widget = QtWidgets.QWidget()
dbutton = QtWidgets.QPushButton("Show Dialog", widget)
dialog = QtWidgets.QDialog(None)
vlay = QtWidgets.QVBoxLayout(dialog)
form = QtWidgets.QFormLayout(None)
vlay.addLayout(form)
form.addRow("Text Input", QtWidgets.QLineEdit())
form.addRow("Float Input", QtWidgets.QSpinBox())
ok = QtWidgets.QPushButton("Ok")
cancel = QtWidgets.QPushButton("Cancel")
hlay = QtWidgets.QHBoxLayout()
hlay.addWidget(ok)
hlay.addWidget(cancel)
vlay.addLayout(hlay)
ok.clicked.connect(dialog.accept)
cancel.clicked.connect(dialog.reject)
dbutton.clicked.connect(dialog.exec_)
widget.show()
app.exec_()
您必须更改两个按钮上的 auto default 设置:
ok = QtWidgets.QPushButton("Ok")
ok.setAutoDefault(False)
cancel = QtWidgets.QPushButton("Cancel")
cancel.setAutoDefault(False)