2016-11-16 23 views
0

Qt Designerを使用してGUIを構築し、pyuic5を使用してpyファイルに変換します。私の最終目標は、変数== 1のときにユーザーがプログラムを終了するのを中断し、「あなたは本当に閉じたいのですか?タイプダイアログ。変数が== 0の場合は、プログラムを正常に閉じます。メインGuiモジュールの外部からのPyQt5割り込み終了イベント

私はこれを行う方法について多くの例を見てきましたが、それらのすべてがGUIモジュールのコードを編集する必要があります。 pyuic5で作成したgui.pyファイルをメインスクリプトにインポートして、ボタンや行編集などのすべての接続を行います。いつでもQt DesignerでGUIを更新でき、プログラムの機能には影響しません。

Qt DesignerのGUIモジュールをインポートしたメインスクリプトからこれを行う方法はありますか?私の主なスクリプトが構造化されているかの

例:デザイン内の特定の「ExitButton」がなら

import philipsControlGui 
import sys 

def main(): 
    MainWindow.show() 
    sys.exit(app.exec_()) 

def test(): 
    print('test') 

# Main window setup 
app = philipsControlGui.QtWidgets.QApplication(sys.argv) 
MainWindow = philipsControlGui.QtWidgets.QMainWindow() 
ui = philipsControlGui.Ui_MainWindow() 
ui.setupUi(MainWindow) 

# Main window bindings 
ui.onButton.clicked.connect(test) 
### Can I insert something here to do: if user closes the window... do something else instead? 

if __name__ == "__main__": 
    main() 
+0

closeEventメソッドをオーバーライドする必要があります(多くの例からわかるように)。あなたがQt Designerでこれを行うことができるかどうかわかりません。 – Trilarion

答えて

1

あなたがcloseEventメソッドを再実装することができますので、あなたは、あなたの輸入GUIからサブクラスを作成する必要があります。

import sys 
from PyQt5 import QtCore, QtGui, QtWidgets 
from philipsControlGui import Ui_MainWindow 

class MainWindow(QtWidgets.QMainWindow):  
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.ui = Ui_MainWindow() 
     self.ui.setUpUi(self) 
     self.ui.onButton.clicked.connect(self.test) 
     self._check_close = True 

    def test(self): 
     print('test') 
     self._check_close = not self._check_close 

    def closeEvent(self, event): 
     if self._check_close: 
      result = QtWidgets.QMessageBox.question(
       self, 'Confirm Close', 'Are you sure you want to close?', 
       QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) 
      if result == QtWidgets.QMessageBox.Yes: 
       event.accept() 
      else: 
       event.ignore() 

def main(): 
    app = QtWidgets.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 

    main() 
+0

これは動作するはずです。ありがとう – WhiskyRyan

-1

は、あなたがメインのコードでそれを接続して、ポップアップダイアログを作成することができるはずです。 QtCore/QtGuiコンポーネントをインポートする必要があります。私はいつも、直接私のGUIを書く(それはこれらの事になるとQtDesignerが痛みである)ので、私はこのようなものを想定しています:

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

[YOUR CODE] 

ui.ExitButton.clicked.connect(Exit) 

def Exit(): 

    msg = QMessageBox() 
    msg.setIcon(QMessageBox.Information) 

    msg.setText("Are you sure you want to close this window?") 
    msg.setWindowTitle("MessageBox demo") 
    msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) 
    msg.buttonClicked.connect(msgbtn) 
    retval = msg.exec_() 
    print "value of pressed message box button:", retval 
+0

ありがとうございます。私はその方法で接続できるExit Action Itemを持っていますが、ユーザーがウィンドウのフレームで「X」ボタンを使用した場合、同じ結果を保証するにはどうすればよいでしょうか? – WhiskyRyan

+0

制御できるメインウィンドウのCloseEventがあります。これを見てみましょう:http://stackoverflow.com/questions/22460003/pyqts-qmainwindow-closeevent-is-never-called – avelampudi

+0

ユーザーがそれをしないことを確認する別の偽の証明方法は、あなたのGUIをいっぱいにすることです - with mainWindow.showFullScreen() – avelampudi

関連する問題