hakeの日記

Windows環境でプログラミングの勉強をしています。

リストビューをつくる

Ruby/Qteの勉強 その14

リストビュー(表?)を作ってみる、使用するクラスはQListViewである。@listを作成したら、.addColumnメソッドでカラムを追加していく。

@list = QListView.new(self)
@list.setGeometry(0,40,635,230)
@list.addColumn(tr("カラム1"))  #カラム追加
@list.addColumn(tr("カラム2"))

アイテムの追加は、QListViewItemを使用する。引数はカラム数によって変化する。

QListViewItem.new(@list, "21", "22") #カラムが2つなのでセットする値も2つ

アイテムは上下カーソルキー+Enterや画面のタップで選択可能で、以下の記述で選択アイテムをメソッドに渡すことができる。

connect(@list, QSIGNAL("clicked(QListViewItem *)"), self, "dispItem")
connect(@list, QSIGNAL("returnPressed(QListViewItem *)"), self, "dispItem")

アイテム選択で、そのアイテムのデータを表示。ボタン1で全アイテムのカラム1のデータを表示するようにしてみる。
アイテム内のデータの表示はitem.text(0).to_strのようにする、引数はカラムの番号。なお、.to_sメソッドは使えなかった。

#!/usr/bin/env ruby

require "qte"
require "qpe"
include Qte
include Qpe


class SampleWindow < QMainWindow
   def initialize()
      super()
      setCaption(tr("サンプル"))

      @list = QListView.new(self)
      @list.setGeometry(0,40,635,230)
      @list.addColumn(tr("カラム1"))  #カラム追加
      @list.addColumn(tr("カラム2"))

#      @list.setAllColumnsShowFocus(true)         #フォーカス変更
#      2.times do |i|                             #2はカラム数
#         @list.setColumnWidth(i, 200)            #カラム幅変更
#         @list.setColumnAlignment(i, AlignRight) #右よせに
#         #@list.setColumnAlignment(i, AlignHCenter)
#      end

      #選択したアイテムをメソッドdispItemへ
      connect(@list, QSIGNAL("clicked(QListViewItem *)"), self, "dispItem")
      connect(@list, QSIGNAL("returnPressed(QListViewItem *)"), self, "dispItem")

      #@listにアイテム追加
      item = QListViewItem.new(@list, "11", "12")
      QListViewItem.new(@list, "21", "22")
      QListViewItem.new(@list, "31", "32")
      #値を書き換え
#      item.setText(0, "10")

      @ebox1 = QMultiLineEdit.new(self)
      @ebox1.setGeometry(0,280,635,120)
      @ebox1.setReadOnly(true)

      @ebox1.clear
      #カラム数を表示
      @ebox1.insertLine(tr("column数 = " + @list.columns.to_s))
      #アイテム数を表示
      @ebox1.insertLine(tr("item数 = " + @list.childCount.to_s))


      @pb1 = QPushButton.new(tr("ボタン1"),self)
      @pb1.setGeometry(320,5,100,30)
      connect(@pb1,QSIGNAL("clicked()"), self, 'dispCol')

   end

   def dispItem(item) #選択したアイテムのカラムを表示
      @ebox1.clear
      @ebox1.insertLine(tr("カラム1=" + item.text(0).to_str))
      @ebox1.insertLine(tr("カラム2=" + item.text(1).to_str))
#      @ebox1.insertLine(item.text(0).utf8().to_str())
   end

   def dispCol #全アイテムのカラム1を表示
      @ebox1.clear
      item = @list.firstChild()
      while (!item.nil?)
         @ebox1.insertLine(tr("col1=" + item.text(0).to_str))
         item = item.nextSibling()
      end
   end
end

$defaultCodec = QTextCodec.codecForName("utf8")
app = QPEApplication.new([$0]+ARGV)
app.setDefaultCodec($defaultCodec)
QApplication.setFont(QFont.new("lcfont",18))
app.showMainWidget(SampleWindow.new)
app.exec