- 何らかの文字列を入力させる処理をしてみましょう。
- ソースコードは utf-8 前提です。
- 動作確認環境 : Ruby 1.8.4-4 + rubyqte 0.5.4
0.5.3
- Ruby/Qte 0.5.3 (厳密にはそのソフト開発で使われているSWIG)のバグにより、このページのサンプルは Ruby/Qte 0.5.4 以降にしないとサンプルその2以降が墜落します。ご注意を。
テキスト閲覧用のウィジェット QTextView と QTextBrowser
テキストの表示を行うには、QTextView を使います。QTextView には QTextBrowser という派生クラスもあり、QTextView の機能はひととおり使えます。
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
| | require 'qte'
require 'qpe'
include Qte
include Qpe
$KCODE = "UTF8"
class MainWindow < QMainWindow
def initialize
super
self.setCaption(tr("QTextView さんぷる"))
@vbox = QVBox.new(self)
self.setCentralWidget(@vbox)
@vbox.setMargin(3)
@hbox_view = QHBox.new(@vbox)
@qtv = QTextView.new(@hbox_view)
@qtb = QTextBrowser.new(@hbox_view)
@hbox_input = QHBox.new(@vbox)
@edt_input = QLineEdit.new(tr(""),@hbox_input)
@btn_input = QPushButton.new(tr("入力"),@hbox_input)
connect(@btn_input, QSIGNAL("clicked()"), self, 'input')
connect(@edt_input, QSIGNAL("returnPressed()"), self, 'input')
@btn_clear = QPushButton.new(tr("消去"),@hbox_input)
connect(@btn_clear, QSIGNAL("clicked()"), self, 'clear')
@edt_input.setFocus
end
def input
@qtv.append(@edt_input.text)
@qtb.append(@edt_input.text)
@edt_input.clear
@edt_input.setFocus
end
def clear
@edt_input.clear
@qtv.setText(tr("")) @qtb.setText(tr(""))
@edt_input.setFocus
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
|
基本的な流れ
ウィジェットを配置して、append か setText で値を流し込みする流れとなります。
なお、.text (実際には string として取り扱うために .local8Bit.to_str にする) の内容を読み出すことで QTextView の中身の取り出しも可能ですが、上記のサンプルコード(append) では改行コードが含まれないため、軽く改造する必要があります。 .append(tr("\n") のメソッドを呼び出す行を足すのが簡単でしょう。
QTextView とその派生クラス、それに QLabel といったウィジェットは、HTML タグを解釈して変換する最小限の機能があります。サンプルのキャプチャ画像は <a size="1">極小 <a size="2">小 <a size="3">中 <font size="4">大 としたのと、<font color="#ff0000">赤 のように入力して表示させています。</font> のような解除タグは省略可能ですが、コーディングで自動的にHTMLタグを挿入させるケースの場合はペアにしておいた方がいいでしょう。なお、Zaurus の Qt/Embedded では font color="red" といった英語での色指定や font color="#fff" といったパレットの省略記法、 b i u といった「飾りタグ」は </font> と同等の意味しかもたないようですので注意しましょう。
Chat風味にしてみる
入力したら不等号記号を HTML タグと解釈されて困ったり、行数が画面をオーバーした場合にはオートスクロールさせてみたくなったりするかもしれません。
ということで、軽く改造してみました。入力された内容は CGI.escapeHTML というメソッドにより置換してから表示するようになってます。
$/ は改行を意味する定義済みグローバル変数です。
.ensureVisible メソッドでオートスクロールを実現しますが、オートスクロールすると表示が若干バグってしまうことがあるので、.repaintContents メソッドで新規行を再描画するようにしています。
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
| | require 'qte'
require 'qpe'
require 'cgi'
include Qte
include Qpe
$KCODE = "UTF8"
class MainWindow < QMainWindow
def initialize
super
self.setCaption(tr("QTextView さんぷる その2"))
@vbox = QVBox.new(self)
self.setCentralWidget(@vbox)
@vbox.setMargin(3)
@hbox_view = QHBox.new(@vbox)
@qtv = QTextView.new(@hbox_view)
initqtvmsg = '<font color="#888888">'
initqtvmsg += 'QTextView さんぷる その2 : Chat風味(HTML入力無効)'
initqtvmsg += '</font>' + $/
@qtv.append(tr(initqtvmsg))
@hbox_input = QHBox.new(@vbox)
@edt_input = QLineEdit.new(tr(""),@hbox_input)
@btn_input = QPushButton.new(tr("入力"),@hbox_input)
connect(@btn_input, QSIGNAL("clicked()"), self, 'input')
connect(@edt_input, QSIGNAL("returnPressed()"), self, 'input')
@btn_clear = QPushButton.new(tr("消去"),@hbox_input)
connect(@btn_clear, QSIGNAL("clicked()"), self, 'clear')
@edt_input.setFocus
end
def input
inputed = @edt_input.text.local8Bit.to_str
unless inputed.empty? then
newline = ""
newline += '<font color="#0000ff">'
newline += Time.now.strftime("%H:%M:%S ")
newline += '</font>'
newline += CGI.escapeHTML(inputed)+$/
@qtv.append(tr(newline))
@qtv.ensureVisible(0,@qtv.contentsHeight,0,0)
@qtv.repaintContents(@qtv.contentsX, @qtv.contentsY, @qtv.contentsWidth, @qtv.contentsHeight, false)
end
@edt_input.clear
@edt_input.setFocus
end
def clear
@edt_input.clear
@qtv.setText(tr(""))
@edt_input.setFocus
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
|