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

24

我正在编写一个小型的PyQt4应用程序,它只是一个简单的“是/否”对话框,需要执行外部命令(例如'eject /dev/sr0')并退出。

这个应用程序可以运行,按下“Yes”按钮后可以执行命令,但我无法在执行命令时使对话框本身退出。

#!/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()

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

4个回答

52
btn.clicked.connect(self.close)

那将是我的建议。


10

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

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

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

9
步骤1:在主类中需要建立一个“连接”:
self.ui.closeButton.clicked.connect(self.closeIt)

步骤2:创建一个类似于关闭的函数:
def closeIt(self): 
        self.close()

我特意命名为"closeIt",因为如果你命名为"close",会发生冲突。

这种解决方案的优点是,如果创建的GUI是另一个程序(如我的情况下的QGIS)的插件,只有活动的GUI将被关闭,而不是整个程序。


1

继承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_()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接