web-dev-qa-db-ja.com

PyQtダイアログ-ボタンを押した後に終了する方法

まあ、私は小さなPyQt4アプリを書いています。これは、外部コマンド(たとえば、 'eject/dev/sr0')を実行して終了しなければならない単一の[はい/いいえ]ダイアログです。

アプリは起動し、「はい」ボタンを押した後にコマンドを実行しますが、コマンドを実行するとダイアログ自体を終了させることができません。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import os
import subprocess
from PyQt4 import QtGui
from PyQt4 import QtCore
from subprocess import call
cmd = 'eject /dev/sr0'

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

        btn = QtGui.QPushButton('Yes', self)     
        btn.clicked.connect(lambda: os.system(cmd))
        btn.resize(180, 40)
        btn.move(20, 35)       

        qbtn = QtGui.QPushButton('No', self)
        qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
        qbtn.resize(180, 40)
        qbtn.move(20, 80) 

        self.setWindowTitle('Test')    
        self.show()

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

これが私のコードです。 「はい」をクリックすると、「eject/dev/sr0」コマンドが正しく呼び出されますが、その後ダイアログは表示されたままです。 「いいえ」をクリックしてアプリを閉じる必要があります。コマンドを実行したときに自動的に閉じます。何を追加/変更する必要がありますか?

14
Laszlo Meller

lambda: os.system(cmd)を、複数のステートメントを持つ関数/メソッドに置き換えます。

def buttonClicked(self):
    os.system(cmd)
    QtCore.QCoreApplication.instance().quit()

...
    btn = QtGui.QPushButton('Yes', self)     
    btn.clicked.connect(self.buttonClicked)
...
8
Jesse Harris
btn.clicked.connect(self.close)

それが私の提案でしょう

36
Manjabes

ステップ1:メインクラスで「接続」を構築する必要があります:

self.ui.closeButton.clicked.connect(self.closeIt)

ステップ2:閉じるような関数を作成します:

def closeIt(self): 
        self.close()

私が意図的に「closeIt」と名付けたのは、「close」と名付けた場合、競合が発生するためです。

このソリューションには、作成されたGUIが別のプログラム(私の場合はQGIS)のプラグインである場合、プログラム全体ではなくアクティブなGUIのみが閉じられるという利点があります。

5
g07kore

QDialog()をサブクラス化し、オブジェクトを使用して閉じます。

class Dialog(QDialog):
    """
        Subclassing QDialog class.
    """
    def __init__(self):
        QDialog.__init__(self)

    def close_clicked(self):
        self.close()

あなたのメイン関数に次のコードを書いてください

dialogbox = Dialog()  # we subclasses QDialog into Dialog
b1= QPushButton("Close",dialogbox)
b1.clicked.connect(dialogbox.close_clicked)
dialogbox.exec_()
0
user12121533