2016-10-20 3 views
1

私はPyQt5で作られたメモリゲームを持っています。PyQt5のQMessageBoxを使ってゲームを再開するか、アプリケーションを終了する

  1. 'もう一度プレイ'
  2. 'チェンジカード'
  3. '終了'

I:ユーザーが勝った場合、私は3つのオプション(ボタン)を使用して、メッセージを表示したいですこれを実装する方法はQMessageBoxを使うことだと思いますが、正しく使用する方法を理解できませんでした。私もそこに私が出て行くために使用することができますStandardButtons、存在する(QMessageBox.Closeを、私はわからない)知っているが、私はそれらを追加することができますかわからない

reply = QMessageBox.question(self, 
    'title', 
    'text', 
    button1 | button2 | button3, 
    defaultButton) 

if reply == button1: 
    # play again 
elif reply == button2: 
    # change cards 
else: 
    # close application 

:私はそれはのようなものでなければなら知っていますそれを動作させるために他のカスタムボタンを使用します。

EDIT 1

[OK]を、私は何かが欠けてSTILているが、私は、正しい方向に向けていくつかのステップをしたと思います。 QMessageBoxにカスタムボタンを追加できましたが、printのいずれかをクリックすると何かが表示されますが、後で呼び出す方法は何もしません。また、 'quit'が選択されている場合は、メッセージボックスを閉じます(私はQCloseEventメソッドを使用していますが、それは間違っている可能性があります)。ここで

は、いくつかのコメントと一緒に更新されたコードです:あなたが見ることができるように

msgBox = QMessageBox() 
msgBox.setStandardButtons(QMessageBox.Close) 
restartBtn = msgBox.addButton('play again', QMessageBox.ActionRole) 
changeBtn = msgBox.addButton('change cards', QMessageBox.ActionRole) 

ret = msgBox.exec() 

if ret == QMessageBox.Close: 
    QCloseEvent() # should close the app, but it closes the message box 
elif msgBox.clickedButton() == restartBtn: 
    print('RESTART') 
    self.restart # should call 'restart' method, but it doesn't 
elif msgBox.clickedButton() == changeBtn: 
    print('CHANGE') 
    changeBtn.clicked.connect(self.showDialog) # should call 'showDialog' method, but it doesn't 

、私はself.methodnameとし、button.clicked.connect(self.methodname)と両方試してみましたが、どれも働きました。

答えて

2

は、あなたはすでにそれを最大限に働いているように見えるが、ここでは完全な例です:メソッドを呼び出した後、私は私が何をやっていたことは、括弧が欠け以外、ほとんど正しかったことに気づき、最後に

def showMessageBox(self): 
    msg = QtWidgets.QMessageBox(self) 
    msg.setIcon(QtWidgets.QMessageBox.Question) 
    msg.setWindowTitle('Prompt') 
    msg.setText('Please choose an option:') 
    play = msg.addButton(
     'Play Again', QtWidgets.QMessageBox.AcceptRole) 
    change = msg.addButton(
     'Change Cards', QtWidgets.QMessageBox.AcceptRole) 
    quit = msg.addButton(
     'Quit', QtWidgets.QMessageBox.RejectRole) 
    msg.setDefaultButton(play) 
    msg.exec_() 
    msg.deleteLater() 
    if msg.clickedButton() is play: 
     print('RESTART') 
     self.restart() 
    elif msg.clickedButton() is change: 
     print('CHANGE') 
     self.showDialog() 
    else: 
     self.close() 
+0

私自身の回答が完了しました。ありがとうございました)! – umbe1987

1

。今すぐコードが実行されていますが、 'quit'がクリックされたとき(メッセージボックスのみ)、アプリケーションを終了していないことを除いて、コードは正常に実行されていますが、方法を見つけるとすぐに私の回答を更新します。これが自分自身の実装を望んでいる誰にとっても良い例になれば幸いです。QMessageBox

最後に、私が試した方法、つまりメソッド自体を呼び出す方法、またはbutton.clicked.connect()メソッドのプレフィックスで呼び出す方法の両方が私のために働いていました。おそらく1つは他のものより良いですが、私は裁判官です。

msgBox = QMessageBox() 
msgBox.setStandardButtons(QMessageBox.Close) 
restartBtn = msgBox.addButton('play again', QMessageBox.ActionRole) 
changeBtn = msgBox.addButton('change cards', QMessageBox.ActionRole) 

ret = msgBox.exec() 

if ret == QMessageBox.Close: 
    QCloseEvent() # should close the app, but it closes the message box 
elif msgBox.clickedButton() == restartBtn: 
    print('RESTART') 
    self.restart() 
elif msgBox.clickedButton() == changeBtn: 
    print('CHANGE') 
    changeBtn.clicked.connect(self.showDialog()) 
1

self.closeは、アプリケーション全体を閉じるメソッドとして機能します。

button.clicked.connect(self.close) 

choice = QtGui.QMessageBox.Yes | QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Quit) 

if choice == QtGui.QMessageBox.Quit: 
     self.close() 
関連する問題