ダイアログを何度もださなくする方法!!




繰り返し処理をしている時に、ダイアログを表示するようにしてしまうと、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になります)