キーへの機能割り当て
Ruby/Qteの勉強 その32
忘れないうちにまとめておく。
特定のキーを押したときにある機能を実行させる場合にはQAccelを使用する。使いかたはQAccelのオブジェクト@keyに対してキーアイテムを追加してから、connectItemでスロット (メソッド)に接続する。
@key = QAccel.new(self) id = @key.insertItem(Qt::Key_A) @key.connectItem(id, self, 'pushA') 以下のように1行でも可 @key.connectItem(@key.insertItem(Qt::Key_A), self, 'pushA')
1行で書いた場合に識別子を知りたいときは、findKeyを使用する。
以下のサンプルは「A」「Ctrl+B」「Return」「Enter」「Cancel」の場合を書いてみた、ザウルスのOKとEnterは「Return」に対応している模様、Cancelはアプリが終了してしまった、多分cloceEventかkeyPressEventで対応させなければいけないのだと思う。全体のキー設定を無効にする場合はsetEbabledを使用、特定のキーを無効にする場合はremoveItemを使用、disconnectItemというのも在ったけれども使い方が悪いのか動作しなかった。
追記
- 特定のキーの有効/無効化は、setItemEnabled(id, bool)の方が良さそうでした。
- Cancelキーを押すと無条件でcloseEventが発生するので、処理はcloseEvent内で行う必要がある。
def closeEvent(e) if 条件判断 終了させない場合の処理 return end 終了させる場合の処理 e.accept end
#!/usr/bin/env ruby require "qte" require "qpe" include Qte include Qpe class SampleWindow < QMainWindow def initialize() super() setCaption(tr("サンプル")) @msg = QLabel.new(tr("QAccelサンプルプログラム"),self) @msg.setGeometry(10,10,300,30) @ebox1 = QMultiLineEdit.new(self) @ebox1.setGeometry(0,100,635,300) @ebox1.setReadOnly(true) @pb1 = QPushButton.new(tr("有効/無効"),self) @pb1.setGeometry(320,5,100,30) connect(@pb1,QSIGNAL("clicked()"), self, 'enableKey') @pb2 = QPushButton.new(tr("Akey有効/無効"),self) @pb2.setGeometry(420,5,150,30) connect(@pb2,QSIGNAL("clicked()"), self, 'keyA') # キー定義 @key = QAccel.new(self) @key.connectItem(@key.insertItem(Qt::Key_A), self, 'pushA') @key.connectItem(@key.insertItem(Qt::Key_B+CTRL), self, 'pushBC') @key.connectItem(@key.insertItem(Qt::Key_Return), self, 'pushReturn') @key.connectItem(@key.insertItem(Qt::Key_Enter), self, 'pushEnter') @key.connectItem(@key.insertItem(Qt::Key_Escape), self, 'pushEscape') end # 全体の有効/無効 def enableKey @en = !@key.isEnabled @key.setEnabled(@en) if @en @ebox1.insertLine(tr("全key有効")) else @ebox1.insertLine(tr("全key無効")) end end def keyA # disconnectItemは使いかたがわからない # @key.disconnectItem(@key.findKey(Qt::Key_A), self, 'pushA') # key_Aの識別子取得 id = @key.findKey(Qt::Key_A) if id != -1 # 存在すれば削除 @key.removeItem(id) @ebox1.insertLine(tr("A_key無効")) else # 存在しなければ追加 id = @key.insertItem(Qt::Key_A) @key.connectItem(id, self, 'pushA') @ebox1.insertLine(tr("A_key有効")) end end def pushA @ebox1.insertLine("push A") end def pushBC @ebox1.insertLine("push B+CTRL") end def pushReturn @ebox1.insertLine("push Return") end def pushEnter @ebox1.insertLine("push Enter") end def pushEscape @ebox1.insertLine("push Cancel") end end $defaultCodec = QTextCodec.codecForName("utf8") app = QPEApplication.new([$0]+ARGV) app.setDefaultCodec($defaultCodec) QApplication.setFont(QFont.new("lcfont",18)) app.showMainWidget(SampleWindow.new) app.exec