hakeの日記

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

リストビューで階層表示

Ruby/Qteの勉強 その15

リストビューで階層(ツリー)表示を行うには、QListViewItemの最初の引数に、親にしたいQListViewItemのインスタンスを指定すれば良い。

item1 = QListViewItem.new(@list, "1", "item1")
  item11 = QListViewItem.new(item1, "11", "item11") #item1に追加
    QListViewItem.new(item11, "111", "item111")     #item11に追加

階層を展開したり閉じたりするのは左右カーソルキーや、アイテム部分のダブルタップ?、枝の+/−記号部分のタップでできる。ただし+/−記号部分は

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

で指定したメソッドにnilが渡されるので、メソッド側で対応する必要がある。

def dispItem(item) #選択したアイテムのカラムを表示
  if !item.nil? then
    (中略)
 end
end

今回はボタン1を押したら選択中のアイテムの子アイテムのカラム1を表示するようにしてみた。選択中のアイテムを得るには.selectedItem()を使用。子どもの最初のアイテムは、.firstChild()で取得です。

#!/usr/bin/env ruby

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


class SampleWindow < QMainWindow
   def initialize()
      super()
      setCaption(tr("サンプル"))
#      @msg = QLabel.new(tr("これはサンプルプログラム"),self)
#      @msg.setGeometry(10,10,300,30)

      @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|
         @list.setColumnWidth(i, 200)
         #@list.setColumnAlignment(i, AlignRight)
         #@list.setColumnAlignment(i, AlignHCenter)
      end

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

      #@listに階層構造のアイテム追加
      item1 = QListViewItem.new(@list, "1", "item1")
        item11 = QListViewItem.new(item1, "11", "item11") #item1に追加
          QListViewItem.new(item11, "111", "item111")     #item11に追加
          QListViewItem.new(item11, "112", "item112")
        item12 = QListViewItem.new(item1, "12", "item12")
        item13 = QListViewItem.new(item1, "13", "item13")
        item14 = QListViewItem.new(item1, "14", "item14")
      item2 = QListViewItem.new(@list, "2", "item2")
        item21 = QListViewItem.new(item2, "21", "item21")
        item22 = QListViewItem.new(item2, "22", "item22")
        item23 = QListViewItem.new(item2, "23", "item23")
      item3 = QListViewItem.new(@list, "3", "item3")
        item31 = QListViewItem.new(item3, "31", "item31")
        item32 = QListViewItem.new(item3, "32", "item32")

      @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) #選択したアイテムのカラムを表示
     if !item.nil? then
      @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
   end

   def dispCol #選択したアイテムの子アイテムのカラム1を表示
      @ebox1.clear
      itemSel = @list.selectedItem() #選択されたアイテム取得
      item = itemSel.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