12

私は単純なアプリケーションを開発しようとしている PyQt のまったくの初心者です。Qt-designer でシンプルな UI をデザインしました。[X] または [終了] ボタンをクリックするか、メニューから [終了] を選択したときに、ユーザーが本当にアプリケーションを終了するかどうか、追加の確認が必要です。

コードは次のとおりです。

import sys
from PyQt4 import QtGui, QtCore, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.ui = uic.loadUi('main_window.ui')
        self.ui.show()

        self.ui.btnExit.clicked.connect(self.close)
        self.ui.actionExit.triggered.connect(self.close)

    def closeEvent(self, event):
        print("event")
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def main():
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

問題はそれです:

  • メイン ウィンドウで [X] をクリックしても、closeEvent 関数がトリガーされない
  • [終了] ボタンをクリックするか、メニューから [終了] を選択すると、関数
    が呼び出されますが、[はい] をクリックしてもアプリケーションが閉じません。

SOに関するいくつかの質問を見つけてチュートリアルを検索しましたが、そのような問題をカバーするものはありませんでした。私は何を間違っていますか?

4

4 に答える 4

18

あなたがやっていることに注意してください:

self.ui = uic.loadUi('main_window.ui')
self.ui.show()

実際ウィンドウは、uiのインスタンス属性 ( )です。それ自体ではありません。そして、それは実装されていません。 winwincloseEvent

loadUi.uiインスタンス内にファイルをロードできます。

PyQt4.uic.loadUi(uifile[, baseinstance=None[, package='']])

あなたはそれを使うべきです。これで、コードは次のようになります。

import sys
from PyQt4 import QtGui, QtCore, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        uic.loadUi('main_window.ui', self)

        self.btnExit.clicked.connect(self.close)
        self.actionExit.triggered.connect(self.close)

    def closeEvent(self, event):
        print("event")
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def main():
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

注: 私はshowのウィンドウを ing するのが好きではありません__init__。明示的な方が良いです。だから、私はそれをに移動しましたmain。自由に変更してください。

于 2013-02-12T14:41:40.930 に答える
0

デザイナから、イベントをメイン ウィンドウに接続し、デザイナで新しいスロットを追加できます。その後、python でメソッドを実装するだけで、イベント -> スロット接続が自動的に行われます。

于 2013-02-12T14:50:11.177 に答える