web-dev-qa-db-ja.com

メインウィンドウの閉じるボタンを処理する適切な方法PyQt、(赤の「X」)

まず、私はPyQtの完全な初心者です。

関数をメインウィンドウの閉じるボタン(ウィンドウの隅にある赤いx)にリンクしようとしましたが、うまくいきませんでした。今のところ、私のコードは次のようになっています。

class Ui_MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
    def setupUi(self, MainWindow):
        #setup code goes here
    def retranslateUi(self, MainWindow):
        #re translation of the GUI code 
    def closeEvent(self, event):
        print "User has clicked the red x on the main window"

別の「メイン」ファイルには、次のものがあります。

class GUIForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self,parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        #self.ui.ECUStatus_txt = MyWidget.__init__.text_list
        self.threadData()


    if __name__ == "__main__":

        app = QtGui.QApplication(sys.argv)
        myapp = GUIForm()
        myapp.show()
        ret = app.exec_()
        sys.exit(ret)

ただし、コマンドプロンプトで実行すると、赤いxを押したときにprintステートメントが表示されません。私はQtに不慣れであることを知っていますが、かなりの数の人々がこの質問をするのを見てきました。そして、答えのどれもすでに上に書かれていることを超えていないようでした。

これらの回答の1つ: 回答#1回答#2

これらのソリューションは両方とも私のものと似ていますが、それでも機能しません

そのユーザーの特定のコードで機能したかもしれない答えにもかかわらず、私の仲間のPyQtの同僚と私は、私たちの同僚が機能していない理由についてまだかなり霧がかかっています。 PyQtに組み込まれている「RedXbox」のボタン名は定義されていますか?他のボタンの場合と同じように、別の機能に接続できますか?

8
sudobangbang

Uiファイルから生成されたクラスを変更しないでください。代わりに、サブクラスを作成してサブクラスを変更する必要があります。

コードの外観から、実際には2つのQMainWindowsを作成していて、closeEventが間違ったもの(おそらく1つは非表示になっていますか?)に対してキャッチされています。つまり、_self.ui_は表示されていないQMainWindowであり、GUIFormのUIに追加されていません。代わりに、Ui_MainWindow.setupUi()メソッドを明示的に使用して、ウィジェットを独自のQMainWindow、 'GUIForm`に追加します。

代わりに、_Ui_MainWindow_クラスをuiファイルから生成されたときの状態のままにして、メインのpythonファイルを次のように変更する必要があります。

_class GUIForm(Ui_MainWindow):
    def __init__(self, parent=None):
        Ui_MainWindow.__init__(self, parent)
        self.threadData()

    def closeEvent(self, event):
        print "User has clicked the red x on the main window"
        event.accept()


if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    myapp = GUIForm()
    myapp.show()
    ret = app.exec_()
    sys.exit(ret)
_

このようにして、自動生成されたUIファイルの動作を拡張します。これにより、コードを再追加することなく、.uiファイルからpythonファイルを簡単に再生成できます(これが、自動生成されたPythonファイル)

8

メインウィンドウからイベント信号を処理するときに問題が発生することがあります。

あなたはコードを使うことができます:

app.aboutToQuit.connect(self.closeEvent)

closeEvent関数で独自のコードを記述できます。

注:

appQtGui.QApplicationインスタンス

これが完全なコードのデモです:

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        #{================================

        app.aboutToQuit.connect(self.closeEvent)

        #}================================

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle('Demo')

    #{================================

    def closeEvent(self):
        #Your desired functionality here
        print('Close button pressed')
        import sys
        sys.exit(0)

    #}================================


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

それが役に立てば幸い。

4
xeon