アプリのラップトップを使いやすくしたい。どこにでもタブ移動できますが、 QPushButton にタブ移動すると、押すことができません Enter、とのみ space。
どうしたの?プレス可能にする方法 Enter?
QPushButton
というタイトルの青い部分までスクロールします。autoDefault
またはdefault
でチェックボックスをオンにします。ほとんどの場合、autoDefault
とdefault
の主な違いは、ボタンのレンダリング方法です。ただし、予期しないことが起こる場合があるため、詳細については以下を参照してください。
すべてのQPushButton
には、継承されない3つのプロパティがあります。これらから、2つの(default
とautoDefault
)がQDialog
sにボタンを配置するとき、これらの設定(およびボタンの1つにフォーカス)が決定するため、ヒットするとボタンが押されます Enter。
これらのプロパティはすべてデフォルトでfalseに設定されています。期待されるのは、ボタンにautoDefault
親がある場合に真になるQDialog
です。
押すたびに space フォーカスのあるボタンが押されます。次のボタンを押すとどうなるかを説明します Enter。
これがtrueに設定されている場合、ボタンはdefaultボタンになります。
If Enter フォーカスがautoDefaultボタンにある場合を除いて、このボタンが押されるよりも、ダイアログで押されます。
デフォルトボタンは1つだけにする必要があります。さらに追加すると、最後に追加されたボタンがデフォルトのボタンになります。
これがtrueに設定されている場合、ボタンはautoDefaultボタンになります。
If Enter ダイアログ上でが押されている場合、フォーカスが置かれている場合はこのボタンが押されます。
AutoDefaultボタンにフォーカスがなく、デフォルトボタンがない場合は、次のautoDefaultボタンが押されます Enter。
これがtrueに設定されている場合、ボタンの境界線は浮き上がりません。
次の表は、どのボタンが異なるフォーカスで異なるボタンで押されるかを示しています。ボタンは左から右に追加されます。
次のコードは、ダイアログにボタンを追加する方法です。 setDefault()
および/またはsetAutoDefault()
のboolean
値を変更することにより、テストに使用できます。
ウィンドウを作成し、QPushButton
と呼ばれるpushButton
とQLabel
と呼ばれるlabel
を追加するだけです(これがデフォルトの命名です)。 。 _#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");
}
}
_
コードをコンパイルすると、このウィンドウが表示されます。 OSによるボタンのレンダリング方法は、ボタンを押すとどのボタンが押されるかを示しているため、ボタンをクリックする必要さえありません。 Enter または space。
この回答のほとんどは、公式文書に従って作成されました。
QPushButtonのドキュメント Qtが以下を述べています:
デフォルトおよび自動デフォルトボタンは、ユーザーがダイアログでEnterキーを押したときに何が起こるかを決定します。
このプロパティがtrueに設定されたボタン(つまり、ダイアログのデフォルトボタン)は、ユーザーがEnterキーを押すと自動的に押されますが、1つの例外があります:autoDefaultボタンに現在フォーカスがある場合、autoDefaultボタンが押されます。ダイアログにautoDefaultボタンがあるがデフォルトボタンがない場合、Enterキーを押すと、現在フォーカスがあるautoDefaultボタンが押されるか、フォーカスチェーン内の次のautoDefaultボタンが押されます。
ダイアログでは、一度に1つのプッシュボタンのみがデフォルトボタンになります。このボタンは、追加のフレームとともに表示されます(GUIスタイルによって異なります)。
デフォルトのボタンの動作は、ダイアログでのみ提供されます。ボタンにフォーカスがあるときにスペースバーを押すと、キーボードからいつでもボタンをクリックできます。
ダイアログが表示されている間に現在のデフォルトボタンのデフォルトプロパティがfalseに設定されている場合、ダイアログのプッシュボタンが次にフォーカスを受け取ったときに新しいデフォルトが自動的に割り当てられます。
QDialog および QMessageBox も確認する価値があります。
Qtのドキュメントによると、Enterは動作するはずです
ダイアログのコマンドボタンは、デフォルトでは自動デフォルトボタンです。つまり、キーボード入力フォーカスを受け取ると、自動的にデフォルトのプッシュボタンになります。デフォルトのボタンは、ユーザーがダイアログでEnterキーまたはReturnキーを押すとアクティブになるプッシュボタンです。 setAutoDefault()でこれを変更できます。
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_())