如何从corfirmation对话框中获得结果

时间:2017-12-20 11:11:31

标签: python dialog pyqt pyqt4

我的弹出窗口结果有问题。下面我展示了部分代码来理解这个问题。

它是一种弹出窗口,用户可以在GUI中进行选择。在此之后它应该显示一个窗口,其中会出现问题"你确定吗?"和两个按钮"是"和"不"。

问题在于,当我测试下面的代码时(msg.show()之前和之后),我的值设置为False

为什么它不能像这样工作:

  • 在功能之前 - > False
  • 显示我的窗口,然后等待按钮
  • 如果我点击了按钮"是",则提供True,否则False

我如何正确处理?还有另一种方法吗?

from PyQt4 import QtCore, QtGui
from Message import Ui_Message
import sys

class MessageBox(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent=None)
        self.msg = Ui_Message()
        self.msg.setupUi(self)
        self.confirmed=False
        self.declined=False

        QtCore.QObject.connect(self.msg.NoButton, QtCore.SIGNAL(("clicked()")), self.Declined)
        QtCore.QObject.connect(self.msg.YesButton, QtCore.SIGNAL(("clicked()")), self.Confirmed)

    def Confirmed(self):
        self.confirmed = True
        MessageBox.close(self)
        return True

    def Declined(self):
        self.declined = True
        MessageBox.close(self)



if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    msg = MessageBox()
    print('Befor show window',msg.confirmed)
    msg.show()
    print('After show window', msg.confirmed)
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

您的示例不起作用,因为您在窗口关闭之前打印“After show window”inspect方法阻止了exec()方法,而不是show()方法,因此您的示例需要像这样编写:

app = QtGui.QApplication(sys.argv)
msg = MessageBox()
print('Before show window', msg.confirmed)
msg.show()
app.exec_() # this blocks, waiting for close
print('After show window', msg.confirmed)
sys.exit()

然而,一个更现实的例子显示如何使用对话框确认一个动作将是这样的:

import sys
from PyQt4 import QtCore, QtGui

class MessageBox(QtGui.QDialog):
    def __init__(self, parent=None):
        super(MessageBox, self).__init__(parent)
        self.yesButton = QtGui.QPushButton('Yes')
        self.noButton = QtGui.QPushButton('No')
        layout = QtGui.QGridLayout(self)
        layout.addWidget(QtGui.QLabel('Are you sure?'), 0, 0)
        layout.addWidget(self.yesButton, 1, 0)
        layout.addWidget(self.noButton, 1, 1)
        self.yesButton.clicked.connect(self.accept)
        self.noButton.clicked.connect(self.reject)

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtGui.QPushButton('Do Something')
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button)

    def handleButton(self):
        if self.confirmSomething():
            print('Yes')
        else:
            print('No')

    def confirmSomething(self):
        msg = MessageBox(self)
        result = msg.exec_() == QtGui.QDialog.Accepted
        msg.deleteLater()
        return result

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    app.exec_()