How can I show a PyQt modal dialog and get data out of its controls once its closed? How can I show a PyQt modal dialog and get data out of its controls once its closed? python python

How can I show a PyQt modal dialog and get data out of its controls once its closed?


Here is simple class you can use to prompt for date:

class DateDialog(QDialog):    def __init__(self, parent = None):        super(DateDialog, self).__init__(parent)        layout = QVBoxLayout(self)        # nice widget for editing the date        self.datetime = QDateTimeEdit(self)        self.datetime.setCalendarPopup(True)        self.datetime.setDateTime(QDateTime.currentDateTime())        layout.addWidget(self.datetime)        # OK and Cancel buttons        buttons = QDialogButtonBox(            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,            Qt.Horizontal, self)        buttons.accepted.connect(self.accept)        buttons.rejected.connect(self.reject)        layout.addWidget(buttons)    # get current date and time from the dialog    def dateTime(self):        return self.datetime.dateTime()    # static method to create the dialog and return (date, time, accepted)    @staticmethod    def getDateTime(parent = None):        dialog = DateDialog(parent)        result = dialog.exec_()        date = dialog.dateTime()        return (date.date(), date.time(), result == QDialog.Accepted)

and to use it:

date, time, ok = DateDialog.getDateTime()


I tried to edit the answer of hluk with the changes below but it got rejected, not sure why because it got some clear bugs as far is I can see.

bugfix 1: removed self. from self.layout.addWidget(self.buttons)

bugfix 2: connected OK and Cancel buttons to its correct actions

enhancement: made the code ready to run by including the imports and improved the run example

from PyQt4.QtGui import QDialog, QVBoxLayout, QDialogButtonBox, QDateTimeEdit, QApplicationfrom PyQt4.QtCore import Qt, QDateTimeclass DateDialog(QDialog):    def __init__(self, parent = None):        super(DateDialog, self).__init__(parent)        layout = QVBoxLayout(self)        # nice widget for editing the date        self.datetime = QDateTimeEdit(self)        self.datetime.setCalendarPopup(True)        self.datetime.setDateTime(QDateTime.currentDateTime())        layout.addWidget(self.datetime)        # OK and Cancel buttons        self.buttons = QDialogButtonBox(            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,            Qt.Horizontal, self)        layout.addWidget(self.buttons)        self.buttons.accepted.connect(self.accept)        self.buttons.rejected.connect(self.reject)    # get current date and time from the dialog    def dateTime(self):        return self.datetime.dateTime()    # static method to create the dialog and return (date, time, accepted)    @staticmethod    def getDateTime(parent = None):        dialog = DateDialog(parent)        result = dialog.exec_()        date = dialog.dateTime()        return (date.date(), date.time(), result == QDialog.Accepted)

and to use it:

app = QApplication([])date, time, ok = DateDialog.getDateTime()print("{} {} {}".format(date, time, ok))app.exec_()