hakeの日記

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

ファイル選択ダイアログの作成

Ruby/Qteの勉強 その20

少し意味のあるプログラムを作成してみようということで、ファイル選択を行うダイアログウィンドウを作成。選択されたファイルの絶対パスをテキストボックスに表示させる。画面タップかEnterキーでファイル選択またはディレクトリ移動を行う。OKだとダイアログウィンドウが閉じてしまうので注意。
課題:シンボリックリンクを介したディレクトリ移動で元の親ディレクトリに戻る方法が不明

#!/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)

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

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

   def openSubWindow
      sw = SubWindow.new(self)
      @ebox1.clear
      if (sw.exec() != 0) || (sw.pbSel?) then
         @ebox1.setText( sw.getFilePath )
      end
   end
end

class SubWindow < QDialog
   def initialize(parent)
      super( nil, "", true) 
      setCaption(tr("ファイル選択"))
      setFixedSize(500,360)

      @label = QLabel.new(tr("/"),self)  #パス表示
      @label.setGeometry(0,0,500,30)

      @list = QListView.new(self)        #ファイルリスト表示
      @list.setGeometry(0,30,500,270)
      @list.addColumn(tr("ファイル"))
      @list.setColumnWidth(0, 490)
#      @list.setAllColumnsShowFocus(true)
      connect(@list, QSIGNAL("clicked(QListViewItem *)"), self, "selectFile")
      connect(@list, QSIGNAL("returnPressed(QListViewItem *)"), self, "selectFile")

      @ebox = QLineEdit.new(self)        #選択ファイル表示
      @ebox.setGeometry(0,300,500,30)
      @ebox.setReadOnly(true)

      @pb = QPushButton.new(tr("選択"),self)
      @pb.setGeometry(200,330,100,30)
      connect(@pb,QSIGNAL("clicked()"), self, 'closeSubWindow')

      @pwd = "/home/zaurus"
      listFile(@pwd)
      @file = nil
      @pbSel = false
   end

   def selectFile(item)       #ファイル選択orディレクトリ移動
     if !item.nil? then
         @file = item.text(0).local8Bit.to_str
         if File.directory?(File.join(@pwd, @file)) then
             Dir.chdir(File.join(@pwd, @file))  #相対パス指定だとダウンする場合あり
             @pwd = Dir.pwd
             listFile(@pwd)
         else
             @ebox.setText(tr(@file))
         end
      end
   end

   def listFile(path)        #ファイルリスト作成
      @label.setText(path)
      @ebox.clear
      @list.clear
      dir = Dir.open(path)
      dir.each{ |name|
         next if name == "."
         next if name =~ /^\.[^\.]+/         # 隠しファイルは非表示
         QListViewItem.new(@list, tr(name))
      }
      dir.close
   end

   def closeSubWindow
      if !@file.nil? then
          @pbSel = true
          close()
      end
   end

   def getFilePath    #選択されたファイルパスを返す
       return tr(File.join(@pwd, @file))
   end

   def pbSel?         #選択ボタンが押されていれば真
       return @pbSel
   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