hakeの日記

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

リストビューでアイテムの複数選択

Ruby/Qteの勉強 その17

アイテムを複数選択可能にするには.setSelectionMode(N)メソッドでセレクションモードを変更する。複数選択可能なモードはN=1,2でN=1(Multi)では各アイテムをタップすることで選択/非選択がトグルする。N=2(Extended)ではWindowsでファイルを複数選択する時とおなじくShiftやCtrlとタップを併用することで複数選択を行う。

追記

SelectionModeは数値での指定よりも定数による指定の方が良いと思われ(未確認だけど多分可能)

QListView::Single
QListView::Multi
QListView::Extended
QListView::NoSelection


複数選択モードでも.setMultiSelection(false)メソッドでfalseがセットされていれば複数選択が無効になる。

@list = QListView.new(self)
@list.setSelectionMode(2)
@list.setMultiSelection(false) #falseで複数選択無効

メソッドdispColで、item.isSelectedにより選択されているかの有無を判断している。アイテムを一つずつ確認しないで選択されたアイテムのみ得る方法はないものか。。。

#!/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.setSelectionMode(2)
      # 0(Single)     :シングル
      # 1(Multi)      :アイテムタップで選択トグル
      # 2(Extended)   :Shift,Ctrlと併用で複数選択
      # 3(NoSelection):非選択

      #falseで複数選択無効
#      @list.setMultiSelection(false)

      @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

      #@listにアイテム追加
      QListViewItem.new(@list, "11", "12")
      QListViewItem.new(@list, "21", "22")
      QListViewItem.new(@list, "31", "32")

      @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 dispCol #選択アイテムのカラム1を表示
        @ebox1.clear
        item = @list.firstChild()
        while (!item.nil?)
          if item.isSelected then   #選択されているか判断
             @ebox1.insertLine(tr("col1=" + item.text(0).to_str))
          end
          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