web-dev-qa-db-fra.com

Comment puis-je afficher une boîte de dialogue modale PyQt et extraire des données de ses contrôles une fois qu'elle est fermée?

Pour une boîte de dialogue intégrée comme QInputDialog, j'ai lu que je peux faire ceci:

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

Comment puis-je émuler ce comportement à l'aide d'une boîte de dialogue que je conçois moi-même dans Qt Designer? Par exemple, je voudrais faire:

my_date, my_time, ok = MyCustomDateTimeDialog.get_date_time(self)
16
Thomas Johnson

Voici une classe simple que vous pouvez utiliser pour demander une 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)

et pour l'utiliser:

date, time, ok = DateDialog.getDateTime()
30
hluk

J'ai essayé d'éditer la réponse de hluk avec les modifications ci-dessous mais elle a été rejetée, je ne sais pas pourquoi, car elle a des bogues clairs pour autant que je puisse voir.

correction de bogue 1: supprimé self. de self.layout.addWidget (self.buttons)

correction de bogue 2: connecté les boutons OK et Annuler à ses actions correctes

amélioration: a rendu le code prêt à être exécuté en incluant les importations et amélioré l'exemple d'exécution

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)

et pour l'utiliser:

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