Top > Ruby > Qte > QPEMenuBar
  • QPEMenuBar (QMenuBar) + QPopupMenu で、ウィンドウ上部のメニューを実現します。
  • ソースコードは utf-8 前提です。
  • 動作確認環境 : Ruby 1.8.4 + rubyqte 0.5.3

メニューを出すサンプル

 ウィンドウ上部のタイトルバーの次にあるお馴染みの「ファイル(F)」「ヘルプ(H)」等のメニューを実現するには、QMenuBar を使用します。ただし、今回は Linux Zaurus 前提のスクリプトであり、Menu キーの押下でメニューを表示させたいということもあるため、今回は QMenuBar の仲間である QPEMenuBar を用います。QMenuBarQPEMenuBar の違いは、Menu キーを押したら何もしないかメニューを展開して表示するか、程度の違いです。また、QPEMenuBar は Qtopia 2.x 系のクラスですので、新しい Qtopia 搭載の Zaurus の想定や Qt への移植を考えるのであれば、QMenuBar を使う方が理想的かもしれません。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
#!/usr/bin/env ruby
require 'qte'
require 'qpe'
 
include Qte
include Qpe
 
$KCODE = "UTF8"
 
class MainWindow < QMainWindow
  def initialize
    super
    self.setCaption(tr("(11) QMenuBar さんぷる"))
 
    #アイコン(テスト用)
    @ico = QPixmap.new("/home/QtPalmtop/pics/SettingsIcon.png")
 
    #テスト用メニュー
    @subtmnu = QPopupMenu.new(self)
    @subtmnu_test = @subtmnu.insertItem("test", self, "mytest")       # "test" 文字列は直後の changeItemで上書きされる
      @subtmnu.changeItem(@subtmnu_test, @ico, tr("通常テスト(&T)") ) # アイコンと文字列上書き
      @subtmnu.setAccel(Qt::Key_T + CTRL, @subtmnu_test)              # Ctrl+T
    @subtmnu_del  = @subtmnu.insertItem(tr("削除テスト(&D)"), self, "mydeltest")
      @subtmnu.setAccel(Qt::Key_D + CTRL, @subtmnu_del)               # Ctrl+D
    @subtmnu_chk  = @subtmnu.insertItem(tr("チェックテスト(&C)"), self, "mychktest")
      @subtmnu.setAccel(Qt::Key_C + CTRL, @subtmnu_chk)               # Ctrl+C
      @subtmnu.setItemChecked(@subtmnu_chk, true)                     # チェック可能メニューにする
            
    #ファイルメニュー
    @submnu = QPopupMenu.new(self)
    @submnu_test = @submnu.insertItem(tr("サブメニューのテスト(&S)"), @subtmnu)
    @submnu.insertSeparator                                           #水平線(セパレータ)
    @submnu_quit = @submnu.insertItem(tr("終了(&Q)"), self, "myquit")
      @submnu.setAccel(Qt::Key_Q + CTRL, @submnu_quit)                # Ctrl+Q
 
    #メニュー本体を登録
    @mnu = QPEMenuBar.new(self)  #Obsoleted なクラス。でも Zaurus では必須。
    #@mnu = QMenuBar.new(self)   #Menu キーを使わない場合はこちらのクラス推奨らしい
    @mnu_file = @mnu.insertItem(tr("ファイル(&F)"),@submnu)
    @mnu_edit = @mnu.insertItem(tr("編集(&E)"))
    @mnu_info = @mnu.insertItem(tr("情報(&I)"))
    
    #グレーアウト
    @mnu.setItemEnabled(@mnu_edit, false)
  end
    
  def mytest
    QMessageBox.about(self, tr("通常テスト"), tr("メニューのテストをしました。"))
  end
 
  def mydeltest
    QMessageBox.about(self, tr("削除テスト"), tr("メニューの削除テストをしました。"))
 
    #@subtmnu.removeItem(@subtmnu_del)   # 削除テスト だけを消す (スクリプト強制終了することがあります)
    @mnu.hide                            # メニューそのものを隠す
    Thread.start {sleep 3; @mnu.show}    # 3秒待ってメニュー復活 (簡単なスレッド利用)
  end
  
  def mychktest
    new_chkstat = !(@subtmnu.isItemChecked(@subtmnu_chk))   # チェック有無を反転して格納
    @subtmnu.setItemChecked(@subtmnu_chk, new_chkstat)      # チェックをトグル
 
    # チェックの有無とメニューのグレーアウトも連動するテスト
    @subtmnu.setItemEnabled(@subtmnu_test, new_chkstat)
    # 有効無効でアイテムの文字列を書き換える
    if( @subtmnu.isItemEnabled(@subtmnu_test) )
      @subtmnu.changeItem(@subtmnu_test,tr("通常テスト 実行可能 (&T)"))
    else
      @submnu.changeItem(@subtmnu_test,tr("通常テスト 実行不可能 (&T)"))
    end
    
  end
  
  def myquit
    exit
  end
end
 
class MyApplication < QPEApplication
  def initialize
    super([$0]+ARGV)
    self.setDefaultCodec(QTextCodec::codecForName("utf-8"))
  end
end
 
app = MyApplication.new
win = MainWindow.new
app.showMainWidget(win)
app.exec
QPEMenuBar.png

基本的な流れ

 画面上部のメニュー一覧(メニューバー)を QPEMenuBar で、「ファイル(F)」のタップや Menu キー押下により表示されるメニューは QPopupMenu で定義されています。いずれも .new(self) メソッドでオブジェクトを生成します。

 QPEMenuBar なオブジェクトでは .insertItem(tr("表示内容"), QPopupMenuオブジェクト名) で登録します。その登録されたアイテムをタップするなどの操作によって、QPopupMenu のサブメニューが呼び出されるからくりになっています。

 QPopupMenu なオブジェクトでは .insertItem(tr("表示内容"), self, "selfのメソッド名") でメニュー内容を登録します。そのメニューを選択して OK を押下したりタップされた場合にメソッド内の処理が行われる、という意味では QPushButton と似ています。引数ふたつ ( .insertItem(tr("サブメニュー名称"), QPipupMenuオブジェクト名) ) とすると、QPopupMenu をネスト、つまりサブメニューを実現できます。

アクセラレータ(ショートカットキー) の登録

 QPushButton と同じように、メニューにアクセラレータを定義できます。  ポップアップメニューオブジェクト.setAccel(割り当てたいキー名, メニュー内容の番号) の形式でメソッドを呼び出します。 メニュー内容の番号は .insertItem 時にあらかじめ変数を取得しておき、それを流用します。

メニューを無効にする

.setItemEnabled(false) メソッドを呼び出すことによって、該当メニューをグレーアウトできます。QPushButton の .setEnabled メソッドと同じ要領で使うことが出来ます。

メニュー内容を上書きする

.changeItem(メニュー内容の番号, アイコン情報, tr("置き換えしたいメニュー内容") ) あるいは .changeItem(メニュー内容の番号, tr("置き換えしたいメニュー内容") ) のメソッドで、アイコンやメニュー内容を変更することが出来ます。アイコン情報については、今回は簡単に QPixmap クラスを使ってファイルを直接フルパスで呼び出しています。たとえば tux.png をフルパス指定してやると、かなり大きいアイコンの登録ができることもわかります(^^ゞ

メニューにチェックを入れる

.setItemEnabled(メニュー内容の番号, true) とすると、そのメニュー番号については「チェック可能である」という属性が付加されます。.isItemChecked(メニュー内容の番号) でメニューのチェック有無が判断できます。

 サンプルでは「通常テスト」を実行するメニューを有効/無効にするようにしています。

メニューバーの隠匿・再表示

.hide メソッドや .show メソッドで QPEMenuBar の表示・非表示を操作することができます。


添付ファイル: fileQPEMenuBar.png 614件 [詳細]

リロード   新規 下位ページ作成 凍結解除 差分 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Fri, 22 Jul 2011 21:57:56 JST (1525d)