38

アプリをラップトップに対応させたい。どこにでもタブで移動できますが、QPushButtonEnterにタブで移動すると、で押すことができず、で押すことができspaceます。
どうしたの?プレス可能にする方法はEnter

4

4 に答える 4

81

tl; dr

  1. Qt CreatorのUIビューで、押すことができるようにするボタンを選択しますEnter
  2. プロパティエディタの右側で、というタイトルの青い部分まで下にスクロールしQPushButtonます。
  3. autoDefaultまたはでチェックボックスをオンにしますdefault

プロパティエディタ

autoDefaultほとんどの場合、との間の主な違いdefaultは、ボタンのレンダリング方法です。ただし、予期しないことが発生する場合がありますので、詳細については以下をお読みください。


完全なレビュー

概要

すべてQPushButtonに継承されない3つのプロパティがあります。これらの設定(およびボタンの1つに焦点を合わせる)によって、を押した場合に押されるボタンが決まるため、sにボタンを配置するときに2つの(defaultおよびautoDefault)が主要な役割を果たします。 これらのプロパティはすべて、デフォルトでfalseに設定されています。唯一の期待は、ボタンに親がある場合に当てはまるということです。QDialogEnter
autoDefaultQDialog

spaceフォーカスのあるボタンを押すたびに押されます。以下に、を押した場合に何が起こるかを説明しますEnter

デフォルトのプロパティ

これがtrueに設定されている場合、ボタンはデフォルトのボタンになります。
ダイアログでが押された場合Enter、フォーカスがautoDefaultボタンにある場合を除いて、このボタンが押されます。

デフォルトのボタンは1つだけにする必要があります。さらに追加すると、最後に追加されたボタンがデフォルトのボタンになります。

AutoDefaultプロパティ

これがtrueに設定されている場合、ボタンはautoDefaultボタンになります。ダイアログでが押された場合、フォーカスがそのダイアログにある場合、このボタンが押されます
Enter

フォーカスがautoDefaultボタンになく、デフォルトボタンがない場合は、次のautoDefaultボタンが押されEnterます。

フラットプロパティ

これがtrueに設定されている場合、ボタンの境界線は表示されません。

テーブルの例

次の表は、さまざまなフォーカスのさまざまなボタンでどのボタンが押されるかを示しています。ボタンは左から右に追加されます。

通常、autoDefault、およびdefaultボタン

通常ボタンとautoDefaultボタン

テストコード

次のコードは、ダイアログにボタンを追加する方法です。および/またはのboolean値を変更することにより、テストに使用できます。 ウィンドウを作成し、呼び出されたものと呼び出されたものを追加するだけです(これがデフォルトの名前です)。することを忘れないでください。次に、このコードをボタンの信号にコピーします。setDefault()setAutoDefault()
QPushButtonpushButtonQLabellabel#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

OSレンダリングボタン

公式ドキュメント

この回答のほとんどは、公式ドキュメントに従って作成されました。Qtによって作成され
QPushButtonドキュメントには、次のように記載されています。

デフォルトボタンと自動デフォルトボタンは、ユーザーがダイアログでEnterキーを押したときに何が起こるかを決定します。

このプロパティがtrueに設定されているボタン(つまり、ダイアログのデフォルトボタン)は、ユーザーがEnterキーを押すと自動的に押されます。ただし、autoDefaultボタンに現在フォーカスがある場合は、autoDefaultボタンが押されます。ダイアログにautoDefaultボタンがあるが、デフォルトボタンがない場合、Enterキーを押すと、現在フォーカスがあるautoDefaultボタンが押されるか、フォーカスがあるボタンがない場合は、フォーカスチェーン内の次のautoDefaultボタンが押されます。

ダイアログでは、一度に1つのプッシュボタンのみをデフォルトのボタンにすることができます。このボタンは、追加のフレームとともに表示されます(GUIスタイルによって異なります)。

デフォルトのボタンの動作は、ダイアログでのみ提供されます。ボタンにフォーカスがあるときにスペースバーを押すと、キーボードからいつでもボタンをクリックできます。

ダイアログが表示されているときに現在のデフォルトボタンでデフォルトプロパティがfalseに設定されている場合、次にダイアログのプッシュボタンがフォーカスを受け取ったときに、新しいデフォルトが自動的に割り当てられます。

QDialogQMessageBoxも確認する価値があります。

于 2013-05-31T06:49:56.110 に答える
3

Qtのドキュメントによると、Enterは機能するはずです

ダイアログのコマンドボタンは、デフォルトでは自動デフォルトボタンです。つまり、キーボード入力フォーカスを受け取ると、自動的にデフォルトのプッシュボタンになります。デフォルトのボタンは、ユーザーがダイアログでEnterキーまたはReturnキーを押したときにアクティブになるプッシュボタンです。これはsetAutoDefault()で変更できます。

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

于 2012-08-09T16:43:54.560 に答える
2

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_())
于 2015-04-30T10:25:00.410 に答える
-3

ウィジェットのタブ順序を設定します。これにより、クリックするためのリターンキーを使用できるようになります。デフォルトではQt内にあります。

于 2012-08-10T05:21:20.817 に答える