Диалоговое окно 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", но после этого диалог все еще отображается. Я должен нажать "Нет", чтобы закрыть приложение, которое я хотел бы, чтобы оно автоматически закрывалось при выполнении команды. Что я должен добавить/изменить?

Ответ 1

Замените lambda: os.system(cmd) с помощью функции/метода, которая имеет несколько операторов.

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

...
    btn = QtGui.QPushButton('Yes', self)     
    btn.clicked.connect(self.buttonClicked)
...

Ответ 2

btn.clicked.connect(self.close)

Это было бы моим предложением

Ответ 3

Шаг 1: в главном классе необходимо создать "соединение":

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

Шаг 2: Создание функции вроде закрытия:

def closeIt(self): 
        self.close()

Я специально назначил "closeIt", потому что, если вы назовете его "закрытым", конфликт будет иметь место.

Это решение имеет то преимущество, что созданный графический интерфейс является плагином для другой программы (например, в моем случае QGIS), только активный графический интерфейс будет закрыт, а не вся программа.

Ответ 4

Подкласс 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_()