リストビューでアイテムの複数選択
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