hakeの日記

Windows環境でプログラミングの勉強をしています。

キーへの機能割り当て

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