hakeの日記

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

クローズイベントの処理

Ruby/Qteの勉強 その31

サブウィンドウを閉じる場合に、「保存」等のボタンを用意して任意の処理をさせてから閉じるようにする場合があるが、ウィンドウ右上のOKをタップすると行いたい処理ができずに直ぐに閉じてしまう。そこでウィンドウ右上のOKをタップしても閉じないようにしてみる。

クラスSubWindowのcloseEventを以下のように書き換えて、変数@cancelCloseがfalseでないと閉じないようにする。変数@cancelCloseは初期設定でtrueにする。なおe.ignoreはあってもなくても結果に変化がありませんでした。

def closeEvent(e)
   if @cancelClose   # @cancelCloseの状態で
#     e.ignore()     #  closeしない
   else
      e.accept()     #  closeする
   end
end

クラスSubWIndowは最初QDialogから継承させてみましたが、これだと書き換えたcloseEventが機能しなかったので、QRDialogから継承させました。この状態でサブウィンドウを開いて右上のOKをタップしても閉じなくなります。サブウィンドウを閉じる処理は「閉じるボタン」で呼ばれるメソッドcloseSubWindow内で、変数@cancelCloseにfalseを設定してからclose()を呼んで閉じるようにさせています。

#!/usr/bin/env ruby

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

class SampleWindow < QMainWindow
   def initialize()
      super()
      setCaption(tr("サンプル"))
      @msg = QLabel.new(tr("SubWindowのclose eventの処理"),self)
      @msg.setGeometry(10,10,300,30)

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

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

   def openSubWindow
      sw = SubWindow.new(self)
      @ebox1.clear
      @ebox1.insertLine("Open Sub Window")
      res = sw.exec()
      @ebox1.insertLine("Close Sub Window")
      @ebox1.insertLine("res = " + res.to_s)
   end
end

#class SubWindow < QDialog
class SubWindow < QRDialog
   def initialize(parent)
      super(parent, "", true) 
      setCaption(tr("サブウィンドウ"))
      setFixedSize(400,200)

      @pb = QPushButton.new(tr("閉じる"),self)
      @pb.setGeometry(150,85,100,30)
      connect(@pb,QSIGNAL("clicked()"), self, 'closeSubWindow')

      @cancelClose = true
   end

   def closeSubWindow
      @cancelClose = false
      close()
   end

   def closeEvent(e)
      if @cancelClose   # @cancelCloseの状態で
#        e.ignore()     #  closeしない
      else
         e.accept()     #  closeする
      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