- アドレス帳、メール一覧からファイラーまで、いろいろと重宝する一覧表 QListView のサンプルです。
- ソースコードは utf-8 前提です。
- 動作確認環境 : Ruby 1.8.4-5 + rubyqte 0.5.4
- Ruby 1.8.5-1 + rubyqte 0.5.4 でも動作OKでした (2006/08/28)
一覧表示の基礎
まずは、QListView ウィジェットを貼り付けただけのシンプルなスクリプトをご覧いただきましょう。
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
| | require 'qte'
require 'qpe'
include Qte
include Qpe
$KCODE = 'UTF8'
class MainWindow < QMainWindow
def initialize
super
self.setCaption(tr("QListView さんぷる"))
@qlv = QListView.new(self)
self.setCentralWidget(@qlv)
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
|
キモとなる部分は 12行目の「@qlv = QListView.new(self)」だけです。これで、ウィンドウ全体にべったりと QListView が張り付きます。これだけでは真っ白なだけで何もできないように思えますが、@qlv.メソッド名 という形で、QListView にどんどん肉付けをしていく形となります。
13行目の「self.setCentralWidget(@qlv)」の次の行に、以下の文を挿入してスクリプトを再起動してみてください。画面上部に一覧表のヘッダが表示されるようになります。
基本としては、@qlv.addColumn メソッドはヘッダ列を作るためだけにあるメソッドです。一つ目の引数で表示したいラベル、二つ目の引数(省略可)で幅をピクセル単位指定します。
#列を登録する
@qlv.addColumn(tr("ID"))
@qlv.addColumn(tr("メモ"),240)
@qlv.addColumn(tr("登録日時"),240)
一覧表のヘッダを確認できたら、一覧表に値をリストアップさせてみます。さらに以下の行を「登録日時」なヘッダ登録行と end の間に挿入します。
QListViewItem.new(QListViewそのもの指定、第ゼロ列目の値、第1列目の値、第2列目の値、(...以下、列数がある限り続く)) という指定でデータをひとつずつ登録となるわけですね。 item1 = QListViewItem.new(...) のようにして値をとっておくと、後で QListViewItem 型を要求するメソッドで使い回すこともできます。
#行を登録する(引数が少ないと空白に、多いと多い分無視される)
QListViewItem.new(@qlv,'0')
QListViewItem.new(@qlv,'1','×') #tr がないと化ける。
QListViewItem.new(@qlv,'2',tr('テスト1')) #引数は少なくてもよい。
QListViewItem.new(@qlv,'3',tr('テスト2'),'1999/01/01',"invisible")
これで、一覧表示の基本は整いました。なお、登録した内容は @qlv.clear のように clear メソッドですべて消去することもできます。Obsoleted なメソッドを自己責任で使うのであれば、@qlv.removeItem(QListViewItem型変数) で特定行の削除も行えるようです。
一覧表示のちょっとした応用
さて、基礎でちょっと不満に思ったことはないですか? たとえば、「右寄せ表示したい」「タップして選択したら左橋の1ますだけではなく行選択させたい」「字が大きすぎる」などなど。とりあえず、それらの問題を解消したバージョンのスクリプトを紹介します。
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
| | require 'qte'
require 'qpe'
include Qte
include Qpe
$KCODE = 'UTF8'
class MainWindow < QMainWindow
def initialize
super
self.setCaption(tr("QListView さんぷる"))
@qlv = QListView.new(self)
self.setCentralWidget(@qlv)
@qlv.addColumn(tr("ID"))
@qlv.addColumn(tr("メモ"),240)
@qlv.addColumn(tr("登録日時"),240)
QListViewItem.new(@qlv,'0')
QListViewItem.new(@qlv,'1',tr('◎'))
QListViewItem.new(@qlv,'2',tr('テスト1')) QListViewItem.new(@qlv,'3',tr('テスト2'),'1999/01/01',"おまけ")
@qlv.setFont(QFont.new('lcfont',16))
@qlv.setColumnWidth(2,120)
connect(@qlv, QSIGNAL("selectionChanged(QListViewItem *)"), self, "item_select(qlvi)")
connect(@qlv, QSIGNAL("doubleClicked(QListViewItem *)"), self, "item_enter(qlvi)")
connect(@qlv, QSIGNAL("returnPressed(QListViewItem *)"), self, "item_enter(qlvi)")
@qlv.setShowSortIndicator(true)
@qlv.setSelectionMode(QListView::Single)
@qlv.setColumnAlignment(0,AlignLeft) @qlv.setColumnAlignment(1,AlignHCenter) @qlv.setColumnAlignment(2,AlignRight)
@qlv.setRootIsDecorated(true)
@qlvi_p = QListViewItem.new(@qlv,'4',tr('親テスト'),'1950/01/01',"invisible")
@qlvi_p2 = QListViewItem.new(@qlvi_p,'4.1',tr('子テスト'),'1975/01/01',"invisible")
@qlvi_p3 = QListViewItem.new(@qlvi_p2,'4.1.1',tr('孫テスト'),'2000/01/01',"invisible")
@qlvi_p3.setText(1,tr('孫テスト[上書]'))
@qlv.setAllColumnsShowFocus(true)
pix = QPixmap.new('/home/QtPalmtop/pics/SettingsIcon.png')
@qlvi_p2.setPixmap(0,pix) @qlv.header.setLabel(2,QIconSet.new(pix),tr('書換日'),100) end
def item_select(qlvi)
puts("selected: " + qlvi.text(0).local8Bit.to_str.toeuc)
end
def item_enter(qlvi)
p qlvi
puts '--- enter ---'
puts qlvi.text(0).local8Bit.to_str.toeuc
puts qlvi.text(1).local8Bit.to_str.toeuc
puts qlvi.text(2).local8Bit.to_str.toeuc
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
|
とりあえず、スクリプト中にいろいろとコメントをつけてあるので、詳細については省略しますが、最初に書いてみた要望に限ってリストアップすれば、以下のようになります。
- 「右寄せ表示したい」
- 53~55行目のように .setColumnAlignment メソッドを使った「列単位の書式設定」ができる。
- 「タップして選択したら左橋の1ますだけではなく行選択させたい」
- 70行目の .setAllColumnsShowFocus(true) メソッドで行単位の選択になる
- 「字が大きすぎる」
- 29行目の .setFont メソッドで QFont 型でフォント名とサイズを指定すれば良い。
ここまできたら、あともう少しの自習で自作のアドレス帳やメール一覧表示も夢ではないでしょう。
QListView に関連する課題事項
実際には可能だけれどサンプルに含んでいない機能がいくつかあります。まだ検証していないものから、試行錯誤したもののうまくいかないものまで、原因はいろいろです。ここに、心当たりのある機能を列挙します。少なくとも、Zaurus 上の Qt/Embedded ではちゃんと使える機能ですので、使えないと早合点しないように q2ch のソースコードが参考になると思います。
- アイテムを全選択させる
- 手動で順序を入れ替える(ソートではなく)
- 文字色をつける(qtmailやq2ch等、引き続き要調査?)
- 背景色をつける(q2ch等。選択していなくても行・列単位で背景色をつけている実装あり)
- カレント行の表示カスタマイズ (カーソル位置の色表示のカスタマイズもできる模様)
アイテムの選択や順序入れ替えはリファレンスにもあるため、なんとかなりそうな気がします。
色に関しては少しやっかいで、HTMLタグによる指定無効で、QLineViewを継承する自作クラスが必須と考えられます。また、メソッドの呼び出しで型が違うなどの苦労が必要になる模様です。もしもよい解決案があれば、ご一報をお願いしますm_ _m