PyQt对话框 - 如何在按下按钮后退出?

Las*_*ler 12 python dialog pyqt

好吧,我正在写一个小的PyQt4应用程序,它只是一个Yes/No对话框,它必须执行一个外部命令(例如'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()
Run Code Online (Sandbox Code Playgroud)

这是我的代码.单击"是"时,它会正确调用"eject/dev/sr0"命令,但之后对话框仍然可见.我必须单击"否"关闭应用程序我希望它在执行命令时自动关闭.我应该添加/修改什么?

Man*_*bes 36

btn.clicked.connect(self.close)
Run Code Online (Sandbox Code Playgroud)

那是我的建议


小智 8

替换lambda: os.system(cmd)为具有多个语句的函数/方法.

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

...
    btn = QtGui.QPushButton('Yes', self)     
    btn.clicked.connect(self.buttonClicked)
...
Run Code Online (Sandbox Code Playgroud)


g07*_*ore 6

Step1:在Main Class中需要构建一个"连接":

self.ui.closeButton.clicked.connect(self.closeIt)
Run Code Online (Sandbox Code Playgroud)

Step2:创建一个类似关闭的函数:

def closeIt(self): 
        self.close()
Run Code Online (Sandbox Code Playgroud)

我故意命名为"closeIt",因为如果你将它命名为"close",就会发生冲突.

如果创建的GUI是另一个程序的插件(例如我的QGIS),则此解决方案具有优势,仅关闭活动GUI而不关闭整个程序.