Top > Ruby > Qte > QTextView
  • 何らかの文字列を入力させる処理をしてみましょう。
  • ソースコードは utf-8 前提です。
  • 動作確認環境 : Ruby 1.8.4-4 + rubyqte 0.5.40.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
#!/usr/bin/env ruby
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)
#QMultiLineEdit はテキストエディタなどで使います。
#       @hbox_multi  = QHBox.new(@vbox)
#         @qmle      = QMultiLineEdit.new(@hbox_multi)
        @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
#   @qmle.append(@edt_input.text)
    @qtv.append(@edt_input.text)
    @qtb.append(@edt_input.text)
    @edt_input.clear
 
    @edt_input.setFocus
  end
  def clear
#   @qmle.clear
    @edt_input.clear
    @qtv.setText(tr("")) #@qtv.clear はメソッドがないので不可
    @qtb.setText(tr("")) #@qtb.clear はメソッドがないので不可
 
    @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
QTextView_Sample.png

基本的な流れ

ウィジェットを配置して、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
#!/usr/bin/env ruby
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
QTextView__Escaped_Sample.png

添付ファイル: fileQTextView_Sample.png 549件 [詳細] fileQTextView__Escaped_Sample.png 525件 [詳細]

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