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

前端 未结 2 818
余生分开走
余生分开走 2020-12-23 15:04

For a built-in dialog like QInputDialog, I\'ve read that I can do this:

text, ok = QtGui.QInputDialog.getText(self, \'Input Dialog\', \'Enter your name:\')
<         


        
相关标签:
2条回答
  • 2020-12-23 15:32

    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()
    
    0 讨论(0)
  • 2020-12-23 15:46

    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, QApplication
    from PyQt4.QtCore import Qt, QDateTime
    
    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
            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_()
    
    0 讨论(0)
提交回复
热议问题