- QPEMenuBar (QMenuBar) + QPopupMenu で、ウィンドウ上部のメニューを実現します。
- ソースコードは utf-8 前提です。
- 動作確認環境 : Ruby 1.8.4 + rubyqte 0.5.3
メニューを出すサンプル
ウィンドウ上部のタイトルバーの次にあるお馴染みの「ファイル(F)」「ヘルプ(H)」等のメニューを実現するには、QMenuBar を使用します。ただし、今回は Linux Zaurus 前提のスクリプトであり、Menu キーの押下でメニューを表示させたいということもあるため、今回は QMenuBar の仲間である QPEMenuBar を用います。QMenuBar と QPEMenuBar の違いは、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
| | 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") @subtmnu.changeItem(@subtmnu_test, @ico, tr("通常テスト(&T)") ) @subtmnu.setAccel(Qt::Key_T + CTRL, @subtmnu_test) @subtmnu_del = @subtmnu.insertItem(tr("削除テスト(&D)"), self, "mydeltest")
@subtmnu.setAccel(Qt::Key_D + CTRL, @subtmnu_del) @subtmnu_chk = @subtmnu.insertItem(tr("チェックテスト(&C)"), self, "mychktest")
@subtmnu.setAccel(Qt::Key_C + CTRL, @subtmnu_chk) @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)
@mnu = QPEMenuBar.new(self) @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("メニューの削除テストをしました。"))
@mnu.hide Thread.start {sleep 3; @mnu.show} 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 で、「ファイル(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 の表示・非表示を操作することができます。