繰り返し処理をしている時に、ダイアログを表示するようにしてしまうと、Yesを連打、、、Noを連打、、、なんということが起きてしまうと思います。
そんな時のために、2回目以降表示しない方法を「PySide版のやり方」と、新機能を使ってシンプルに書いた「PySide2版のやり方」で考えてみたいと思います!
QMessageBoxを使う場合(PySide/Qt5.2以前)
「QMessageBox.information」「QMessageBox.question」「QMessageBox.warning」「QMessageBox.critical」を使う場合は、表示するボタンに「SaveAll」「YesToAll」「NoToAll」などを追加すると、処理が分岐しやすくなります!(*´ω`*)b
from PySide import QtGui # ダイアログを表示するか管理するフラグ showDialog = True # 10回繰り返す for i in range(10): # 表示フラグがTrueのときだけ出す if showDialog: # Yes YesToAll No Cancelがあるダイアログを表示する result = QtGui.QMessageBox.question( None, 'My Application', 'Do you want to save your changes?', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No | QtGui.QMessageBox.Cancel | QtGui.QMessageBox.YesToAll ) if result == QtGui.QMessageBox.YesToAll: result = QtGui.QMessageBox.Yes# 後の処理がやりやすいようにYesが押されたことにする showDialog = False# 次回からダイアログを表示しないようにフラグを変更する elif result == QtGui.QMessageBox.Cancel: print 'Clicked Cancel' break# 繰り返し処理を終わらせる else: # 表示フラグが無い場合は、Yesが押されたことにする result = QtGui.QMessageBox.Yes # 押されたボタンを表示する print '#%s'%i, result
試しにやってみると、このような感じになります!
QMessageBoxを使う場合(PySide2/Qt5.2以降)
PySide2からは、QMessageBoxにQCheckBoxを追加できるようになったので、「Don’t show this again.」といったラベルのチェックボックスを入れて、使う側もわかりやすく、開発者も作りやすくなりました!
from PySide2 import QtWidgets # ダイアログを表示するか管理するフラグ showDialog = True # 10回繰り返す for i in range(10): # 表示フラグがTrueのときだけ出す if showDialog: checkBox = QtWidgets.QCheckBox('Don\'t show this again.') messageBox = QtWidgets.QMessageBox() messageBox.setWindowTitle('Application') messageBox.setText('Do you want to save your changes?') messageBox.setIcon(QtWidgets.QMessageBox.Question) messageBox.setStandardButtons( QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Cancel ) messageBox.setCheckBox(checkBox) result = messageBox.exec_() # CheckBoxをONにしたか確認 if checkBox.isChecked() == True: showDialog = False# 次回からダイアログを表示しないようにフラグを変更する if result == QtWidgets.QMessageBox.Cancel: print 'Clicked Cancel' break# 繰り返し処理を終わらせる # 押されたボタンを表示する print '#%s'%i, result
試しにやってみると、このような感じになります!(0x4000はYes、0x10000はNoになります)