クローズイベントの処理
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