2017-06-28 1 views
0

QtableWidgetにフォーム(インポートフォーム)が設定されています。各フォームは、基本的に、カップルプッシュボタンとスピンボックスを含むQgroupboxです。私は、矢印キーをグループボックス間を移動するために使用できるように、これらをテーブルに配置することを選択しました。しかし、私は各プッシュボタンがキーボードショートカットを介してチェック可能で、スピンボックスがある種のキーボードショートカット(おそらくシフト+矢印)で調整されるようにしたい。私はナビゲーションがほとんど機能していますが、プッシュボタンに割り当てたショートカットは機能しません。そのグループボックス内のターゲットウィジェットにフォーカスを当てているグループボックスからショートカットを「渡す」方法が必要なようです。スピンボックスの調整に関する第2の問題は関連しているようですが、これを設定する方法についてはあまり明確ではありません。pyqt5ショートカットを子ウィジェットに接続する方法

フォームのほとんどのコード(QTCtreatorで生成)を添付しました。ショートカットコードが再変換メソッドにあるのは面白いことです。フォームまあ

class Ui_FormLoads(object): 
    def setupUi(self, FormLoads): 
     FormLoads.setObjectName("FormLoads") 
     FormLoads.resize(88, 105) 
     FormLoads.setFocusPolicy(QtCore.Qt.TabFocus) 
     FormLoads.setWindowTitle("LoadChannel") 
     self.gridLayout = QtWidgets.QGridLayout(FormLoads) 
     self.gridLayout.setContentsMargins(8, 8, 8, 8) 
     self.gridLayout.setSpacing(0) 
     self.gridLayout.setObjectName("gridLayout") 
     self.groupBox = QtWidgets.QGroupBox(FormLoads) 
     font = QtGui.QFont() 
     font.setPointSize(10) 
     self.groupBox.setFont(font) 
     self.groupBox.setObjectName("groupBox") 
     self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox) 
     self.gridLayout_2.setContentsMargins(8, 8, 8, 8) 
     self.gridLayout_2.setObjectName("gridLayout_2") 
     self.pushStop = QtWidgets.QPushButton(self.groupBox) 
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 
     sizePolicy.setHeightForWidth(self.pushStop.sizePolicy().hasHeightForWidth()) 
     self.pushStop.setSizePolicy(sizePolicy) 
     self.pushStop.setMinimumSize(QtCore.QSize(30, 0)) 
     font = QtGui.QFont() 
     font.setPointSize(10) 
     self.pushStop.setFont(font) 
     self.pushStop.setText("Stop") 
     self.pushStop.setCheckable(True) 
     self.pushStop.setObjectName("pushStop") 
     self.gridLayout_2.addWidget(self.pushStop, 1, 0, 1, 1) 
     self.pushReload = QtWidgets.QPushButton(self.groupBox) 
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 
     sizePolicy.setHeightForWidth(self.pushReload.sizePolicy().hasHeightForWidth()) 
     self.pushReload.setSizePolicy(sizePolicy) 
     self.pushReload.setMinimumSize(QtCore.QSize(30, 0)) 
     font = QtGui.QFont() 
     font.setPointSize(10) 
     self.pushReload.setFont(font) 
     self.pushReload.setText("Load") 
     self.pushReload.setCheckable(True) 
     self.pushReload.setObjectName("pushReload") 
     self.gridLayout_2.addWidget(self.pushReload, 1, 1, 1, 1) 
     self.spinBox = QtWidgets.QSpinBox(self.groupBox) 
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 
     sizePolicy.setHeightForWidth(self.spinBox.sizePolicy().hasHeightForWidth()) 
     self.spinBox.setSizePolicy(sizePolicy) 
     self.spinBox.setMinimumSize(QtCore.QSize(51, 0)) 
     font = QtGui.QFont() 
     font.setPointSize(13) 
     self.spinBox.setFont(font) 
     self.spinBox.setMinimum(-20) 
     self.spinBox.setMaximum(12) 
     self.spinBox.setObjectName("spinBox") 
     self.gridLayout_2.addWidget(self.spinBox, 0, 0, 1, 2) 
     self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1) 

     self.retranslateUi(FormLoads) 
     QtCore.QMetaObject.connectSlotsByName(FormLoads) 

    def retranslateUi(self, FormLoads): 
     _translate = QtCore.QCoreApplication.translate 
     self.groupBox.setTitle(_translate("FormLoads", "GroupBox")) 
     self.pushStop.setShortcut(_translate("FormLoads", "S")) 
     self.pushReload.setShortcut(_translate("FormLoads", "L")) 
+0

あなたはtranslateメソッドでこれをしたいのはなぜ? – eyllanesc

+0

私はtranslateメソッドで必ずしもそうとは限りませんが、それはQtCreatorが自動的に置く場所です。それがバグなのか不思議です。 – chmedly

+0

さて、スピンボックスはどういう意味ですか? – eyllanesc

答えて

1

のグリッドの単一形の

画像

画像、私はこれを行う方法を考え出しました。 [btw formLoadは、フォームを反復処理して表を作成するときに使用している変数名です。 actionStopは、私がこの特定のショートカットに使用している変数名です。]

self.formLoad.actionStop = QtWidgets.QShortcut(QtGui.QKeySequence("S"), self.formLoad) 
self.formLoad.actionStop.activated.connect(self.formLoad.ui.pushStop.click) 
self.formLoad.actionStop.setContext(QtCore.Qt.WidgetWithChildrenShortcut) 

A)最初は範囲と焦点を理解していました。私は、フォームのための最もシニアなウィジェットを強烈に設定し、スピンボックスを除くすべてのものは焦点を合わせませんでした。スピンボックスはホイールフォーカスに設定されています。ホイールフォーカスまたはタイプ入力が可能です。フォーカス設定は、QtCreator/Designerで設定することができます。つまり、メインpyファイルに追加する必要がある数が少なくなります。ボタンからフォーカスを離しておくと、キーコマンドが、システム環境設定でキーボードショートカットが「すべて」に設定されているかどうかによってMac上で問題が発生する可能性がある個々のボタンにフォーカスを移動させないようにします。次に、コンテキスト属性を 'WidgetWithChildrenShortcut'に設定すると、keyコマンドがトップウィジェットから押ボタンまでフィルタリングできます。 [btw、QtCreatorで設定できるショートカットを使用してコンテキストを定義する方法はありません。そのため、明示的にショートカットを定義しました。] actionStopショートカットを作成したときに、formLoadに割り当てられたことがわかります親。これにより、strongfocusに設定されているウィジェットにショートカットが割り当てられます。

B)次に、ショートカットによって「トリガー」できる属性(およびその名前)を特定しなければなりませんでした。これらは、QPushButtonまたはQSpinBoxのメインのQTページにはっきりと記載されていません。 QAbstractSpinBoxのQTドキュメントで上下のボタンの属性を見つけました。 'stepUp'と 'stepDown'は、スピンボックスの上または下のボタンをクリックするのと同じです。このケースでは、Altキーを使って上下の矢印を使用しました。 Qtのドキュメントには、文字列タイトルのあるキーコマンドのリスト(「Alt + Up」など)があります。

self.formLoad.actionZero = QtWidgets.QShortcut(QtGui.QKeySequence("0"), self.formLoad) 
    self.formLoad.actionZero.setContext(QtCore.Qt.WidgetWithChildrenShortcut) 
    self.formLoad.actionZero.activated.connect(functools.partial(self.spinboxset, 0, self.formLoad.ui.spinBox)) 

@QtCore.pyqtSlot() 
def spinboxset(self, key, spInBox): 
    spInBox.setValue(key) 

C)最後に、私が直接スピンボックスに特定の値をロードし、いくつかのキーコマンドを実施することを決定しました。これは、あなたがactivate.connect行から直接 'setValue'関数を使用することができないため、扱いにくかったです。私はラムダのいくつかのバリエーションを試してみましたが、functoolsをインポートし、別の関数を使ってpartialを使うことはうまくいきました。 partialによって渡されている最後の要素は、投入されたセルのサブウィジェットであったスピンボックスです。この方法では、メソッドは値を適用するスピンボックスを知っています。これを送信せずに、その名前で定義された最後の 'formLoad.spinBox'に常に値を適用します。 2番目の要素(キーと呼ばれます)が値になります。これにより、複数のキーコマンドに1つのメソッド(スピンボックスセット)を使用できます。例えば、「5」に他のものを設定することができる。今

self.formLoad.actionFive = QtWidgets.QShortcut(QtGui.QKeySequence("5"), self.formLoad) 
self.formLoad.actionFive.setContext(QtCore.Qt.WidgetWithChildrenShortcut) 
self.formLoad.actionFive.activated.connect(functools.partial(self.spinboxset, 5, self.formLoad.ui.spinBox)) 

、誰かがどのように私が設定されますセル間のセルのすべての設定をコピーして貼り付けるには私を見ることができれば...

関連する問題