diff options
Diffstat (limited to 'examples/widgets/dialogs/standarddialogs/standarddialogs.py')
-rw-r--r-- | examples/widgets/dialogs/standarddialogs/standarddialogs.py | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/examples/widgets/dialogs/standarddialogs/standarddialogs.py b/examples/widgets/dialogs/standarddialogs/standarddialogs.py new file mode 100644 index 000000000..ef677d5a8 --- /dev/null +++ b/examples/widgets/dialogs/standarddialogs/standarddialogs.py @@ -0,0 +1,437 @@ +# Copyright (C) 2013 Riverbank Computing Limited. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +"""PySide6 port of the widgets/dialogs/standarddialogs example from Qt v5.x""" + +import sys +from textwrap import dedent + +from PySide6.QtCore import QDir, Qt, Slot +from PySide6.QtGui import QFont, QPalette +from PySide6.QtWidgets import (QApplication, QColorDialog, QCheckBox, QDialog, + QErrorMessage, QFontDialog, QFileDialog, QFrame, + QGridLayout, QGroupBox, QInputDialog, QLabel, + QLineEdit, QMessageBox, QPushButton, + QSizePolicy, QSpacerItem, QToolBox, + QVBoxLayout, QWidget) + + +class DialogOptionsWidget(QGroupBox): + """Widget displaying a number of check boxes representing the dialog + options.""" + def __init__(self, parent=None): + super().__init__(parent) + self._layout = QVBoxLayout(self) + self._mapping = {} + + def value(self): + result = 0 + for checkbox, value in self._mapping.items(): + if checkbox.isChecked(): + result |= value + return result + + def add_checkbox(self, text, value): + checkbox = QCheckBox(text) + self._layout.addWidget(checkbox) + self._mapping[checkbox] = value + + +class Dialog(QDialog): + + def __init__(self, parent=None): + super().__init__(parent) + + self._open_files_path = '' + + self._error_message_dialog = QErrorMessage(self) + + frame_style = QFrame.Sunken | QFrame.Panel + + self._integer_label = QLabel() + self._integer_label.setFrameStyle(frame_style) + self._integer_button = QPushButton("QInputDialog.get&Integer()") + + self._double_label = QLabel() + self._double_label.setFrameStyle(frame_style) + self._double_button = QPushButton("QInputDialog.get&Double()") + + self._item_label = QLabel() + self._item_label.setFrameStyle(frame_style) + self._item_button = QPushButton("QInputDialog.getIte&m()") + + self._text_label = QLabel() + self._text_label.setFrameStyle(frame_style) + self._text_button = QPushButton("QInputDialog.get&Text()") + + self._multiline_text_label = QLabel() + self._multiline_text_label.setFrameStyle(frame_style) + self._multiline_text_button = QPushButton("QInputDialog::get&MultiLineText()") + + self._color_label = QLabel() + self._color_label.setFrameStyle(frame_style) + self._color_button = QPushButton("QColorDialog.get&Color()") + self._color_options = DialogOptionsWidget() + self._color_options.add_checkbox("Show alpha channel", + QColorDialog.ShowAlphaChannel) + self._color_options.add_checkbox("No buttons", + QColorDialog.NoButtons) + + self._font_label = QLabel() + self._font_label.setFrameStyle(frame_style) + self._font_button = QPushButton("QFontDialog.get&Font()") + self._font_options = DialogOptionsWidget() + self._font_options.add_checkbox("Do not use native dialog", + QFontDialog.DontUseNativeDialog) + self._font_options.add_checkbox("Show scalable fonts", + QFontDialog.ScalableFonts) + self._font_options.add_checkbox("Show non-scalable fonts", + QFontDialog.NonScalableFonts) + self._font_options.add_checkbox("Show monospaced fonts", + QFontDialog.MonospacedFonts) + self._font_options.add_checkbox("Show proportional fonts", + QFontDialog.ProportionalFonts) + self._font_options.add_checkbox("No buttons", QFontDialog.NoButtons) + + self._directory_label = QLabel() + self._directory_label.setFrameStyle(frame_style) + self._directory_button = QPushButton("QFileDialog.getE&xistingDirectory()") + + self._open_file_name_label = QLabel() + self._open_file_name_label.setFrameStyle(frame_style) + self._open_file_name_button = QPushButton("QFileDialog.get&OpenFileName()") + + self._open_file_names_label = QLabel() + self._open_file_names_label.setFrameStyle(frame_style) + self._open_file_names_button = QPushButton("QFileDialog.&getOpenFileNames()") + + self._save_file_name_label = QLabel() + self._save_file_name_label.setFrameStyle(frame_style) + self._save_file_name_button = QPushButton("QFileDialog.get&SaveFileName()") + + self._file_options = DialogOptionsWidget() + self._file_options.add_checkbox("Do not use native dialog", + QFileDialog.DontUseNativeDialog) + self._file_options.add_checkbox("Show directories only", + QFileDialog.ShowDirsOnly) + self._file_options.add_checkbox("Do not resolve symlinks", + QFileDialog.DontResolveSymlinks) + self._file_options.add_checkbox("Do not confirm overwrite", + QFileDialog.DontConfirmOverwrite) + self._file_options.add_checkbox("Readonly", QFileDialog.ReadOnly) + self._file_options.add_checkbox("Hide name filter details", + QFileDialog.HideNameFilterDetails) + self._file_options.add_checkbox("Do not use custom directory icons (Windows)", + QFileDialog.DontUseCustomDirectoryIcons) + + self._critical_label = QLabel() + self._critical_label.setFrameStyle(frame_style) + self._critical_button = QPushButton("QMessageBox.critica&l()") + + self._information_label = QLabel() + self._information_label.setFrameStyle(frame_style) + self._information_button = QPushButton("QMessageBox.i&nformation()") + + self._question_label = QLabel() + self._question_label.setFrameStyle(frame_style) + self._question_button = QPushButton("QMessageBox.&question()") + + self._warning_label = QLabel() + self._warning_label.setFrameStyle(frame_style) + self._warning_button = QPushButton("QMessageBox.&warning()") + + self._error_button = QPushButton("QErrorMessage.showM&essage()") + + self._integer_button.clicked.connect(self.set_integer) + self._double_button.clicked.connect(self.set_double) + self._item_button.clicked.connect(self.set_item) + self._text_button.clicked.connect(self.set_text) + self._multiline_text_button.clicked.connect(self.set_multiline_text) + + self._color_button.clicked.connect(self.set_color) + self._font_button.clicked.connect(self.set_font) + self._directory_button.clicked.connect(self.set_existing_directory) + self._open_file_name_button.clicked.connect(self.set_open_file_name) + self._open_file_names_button.clicked.connect(self.set_open_file_names) + self._save_file_name_button.clicked.connect(self.set_save_file_name) + self._critical_button.clicked.connect(self.critical_message) + self._information_button.clicked.connect(self.information_message) + self._question_button.clicked.connect(self.question_message) + self._warning_button.clicked.connect(self.warning_message) + self._error_button.clicked.connect(self.error_message) + + vertical_layout = QVBoxLayout(self) + toolbox = QToolBox() + + vertical_layout.addWidget(toolbox) + page = QWidget() + layout = QGridLayout(page) + layout.addWidget(self._integer_button, 0, 0) + layout.addWidget(self._integer_label, 0, 1) + layout.addWidget(self._double_button, 1, 0) + layout.addWidget(self._double_label, 1, 1) + layout.addWidget(self._item_button, 2, 0) + layout.addWidget(self._item_label, 2, 1) + layout.addWidget(self._text_button, 3, 0) + layout.addWidget(self._text_label, 3, 1) + layout.addWidget(self._multiline_text_label, 4, 1) + layout.addWidget(self._multiline_text_button, 4, 0) + spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding) + layout.addItem(spacer, 5, 0) + toolbox.addItem(page, "Input Dialogs") + + page = QWidget() + layout = QGridLayout(page) + layout.addWidget(self._color_button, 0, 0) + layout.addWidget(self._color_label, 0, 1) + spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding) + layout.addItem(spacer, 1, 0) + layout.addWidget(self._color_options, 2, 0, 1, 2) + toolbox.addItem(page, "Color Dialog") + + page = QWidget() + layout = QGridLayout(page) + layout.addWidget(self._font_button, 0, 0) + layout.addWidget(self._font_label, 0, 1) + spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding) + layout.addItem(spacer, 1, 0) + layout.addWidget(self._font_options, 2, 0, 1, 2) + toolbox.addItem(page, "Font Dialog") + + page = QWidget() + layout = QGridLayout(page) + layout.addWidget(self._directory_button, 0, 0) + layout.addWidget(self._directory_label, 0, 1) + layout.addWidget(self._open_file_name_button, 1, 0) + layout.addWidget(self._open_file_name_label, 1, 1) + layout.addWidget(self._open_file_names_button, 2, 0) + layout.addWidget(self._open_file_names_label, 2, 1) + layout.addWidget(self._save_file_name_button, 3, 0) + layout.addWidget(self._save_file_name_label, 3, 1) + spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding) + layout.addItem(spacer, 4, 0) + layout.addWidget(self._file_options, 5, 0, 1, 2) + + toolbox.addItem(page, "File Dialogs") + + page = QWidget() + layout = QGridLayout(page) + layout.addWidget(self._critical_button, 0, 0) + layout.addWidget(self._critical_label, 0, 1) + layout.addWidget(self._information_button, 1, 0) + layout.addWidget(self._information_label, 1, 1) + layout.addWidget(self._question_button, 2, 0) + layout.addWidget(self._question_label, 2, 1) + layout.addWidget(self._warning_button, 3, 0) + layout.addWidget(self._warning_label, 3, 1) + layout.addWidget(self._error_button, 4, 0) + spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding) + layout.addItem(spacer, 5, 0) + toolbox.addItem(page, "Message Boxes") + + self.setWindowTitle("Standard Dialogs") + + @Slot() + def set_integer(self): + i, ok = QInputDialog.getInt(self, + "QInputDialog.getInteger()", "Percentage:", 25, 0, 100, 1) + if ok: + self._integer_label.setText(f"{i}%") + + @Slot() + def set_double(self): + d, ok = QInputDialog.getDouble(self, "QInputDialog.getDouble()", + "Amount:", 37.56, -10000, 10000, 2) + if ok: + self._double_label.setText(f"${d:g}") + + @Slot() + def set_item(self): + items = ("Spring", "Summer", "Fall", "Winter") + + item, ok = QInputDialog.getItem(self, "QInputDialog.getItem()", "Season:", items, 0, False) + if ok and item: + self._item_label.setText(item) + + @Slot() + def set_text(self): + text, ok = QInputDialog.getText(self, "QInputDialog.getText()", + "User name:", QLineEdit.Normal, QDir.home().dirName()) + if ok and text != '': + self._text_label.setText(text) + + @Slot() + def set_multiline_text(self): + text, ok = QInputDialog.getMultiLineText(self, "QInputDialog::getMultiLineText()", + "Address:", "John Doe\nFreedom Street") + if ok and text != '': + self._multiline_text_label.setText(text) + + @Slot() + def set_color(self): + options_value = self._color_options.value() + options = QColorDialog.ColorDialogOptions(options_value) + color = QColorDialog.getColor(Qt.green, self, "Select Color", options) + + if color.isValid(): + self._color_label.setText(color.name()) + self._color_label.setPalette(QPalette(color)) + self._color_label.setAutoFillBackground(True) + + @Slot() + def set_font(self): + options_value = self._font_options.value() + options = QFontDialog.FontDialogOptions(options_value) + + description = self._font_label.text() + default_font = QFont() + if description: + default_font.fromString(description) + + ok, font = QFontDialog.getFont(default_font, self, "Select Font", options) + if ok: + self._font_label.setText(font.key()) + self._font_label.setFont(font) + + @Slot() + def set_existing_directory(self): + options_value = self._file_options.value() + options = QFileDialog.Options(options_value) | QFileDialog.ShowDirsOnly + + directory = QFileDialog.getExistingDirectory(self, "QFileDialog.getExistingDirectory()", + self._directory_label.text(), options) + if directory: + self._directory_label.setText(directory) + + @Slot() + def set_open_file_name(self): + options_value = self._file_options.value() + options = QFileDialog.Options(options_value) + + fileName, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", + self._open_file_name_label.text(), + "All Files (*);;Text Files (*.txt)", "", options) + if fileName: + self._open_file_name_label.setText(fileName) + + @Slot() + def set_open_file_names(self): + options_value = self._file_options.value() + options = QFileDialog.Options(options_value) + + files, _ = QFileDialog.getOpenFileNames(self, "QFileDialog.getOpenFileNames()", + self._open_files_path, + "All Files (*);;Text Files (*.txt)", "", options) + if files: + self._open_files_path = files[0] + file_list = ', '.join(files) + self._open_file_names_label.setText(f"[{file_list}]") + + @Slot() + def set_save_file_name(self): + options_value = self._file_options.value() + options = QFileDialog.Options(options_value) + + fileName, _ = QFileDialog.getSaveFileName(self, "QFileDialog.getSaveFileName()", + self._save_file_name_label.text(), + "All Files (*);;Text Files (*.txt)", "", options) + if fileName: + self._save_file_name_label.setText(fileName) + + @Slot() + def critical_message(self): + m = dedent("""\ + Activating the liquid oxygen stirring fans caused an + explosion in one of the tanks. Liquid oxygen levels + are getting low. This may jeopardize the moon landing mission.""") + msg_box = QMessageBox(QMessageBox.Critical, "QMessageBox.critical()", + "Houston, we have a problem", + QMessageBox.Abort | QMessageBox.Retry | QMessageBox.Ignore, + self) + msg_box.setInformativeText(m) + reply = msg_box.exec() + if reply == QMessageBox.Abort: + self._critical_label.setText("Abort") + elif reply == QMessageBox.Retry: + self._critical_label.setText("Retry") + else: + self._critical_label.setText("Ignore") + + @Slot() + def information_message(self): + m = dedent("""\ + This phrase was often used by public address announcers at + the conclusion of Elvis Presley concerts in order to + disperse audiences who lingered in hopes of an encore. + It has since become a catchphrase and punchline.""") + msg_box = QMessageBox(QMessageBox.Information, "QMessageBox.information()", + "Elvis has left the building.", + QMessageBox.Ok, self) + msg_box.setInformativeText(m) + reply = msg_box.exec() + if reply == QMessageBox.Ok: + self._information_label.setText("OK") + else: + self._information_label.setText("Escape") + + @Slot() + def question_message(self): + m = dedent("""\ + A cheeseburger is a hamburger topped with cheese. + Traditionally, the slice of cheese is placed on top of the + meat patty. The cheese is usually added to the cooking + hamburger patty shortly before serving, which allows the + cheese to melt.""") + msg_box = QMessageBox(QMessageBox.Question, "QMessageBox.question()", + "Would you like cheese with that?", + QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) + msg_box.setInformativeText(m) + reply = msg_box.exec() + if reply == QMessageBox.Yes: + self._question_label.setText("Yes") + elif reply == QMessageBox.No: + self._question_label.setText("No") + else: + self._question_label.setText("Cancel") + + @Slot() + def warning_message(self): + msg_box = QMessageBox(QMessageBox.Warning, "QMessageBox.warning()", + "Delete the only copy of your movie manuscript?", + QMessageBox.NoButton, self) + m = "You've been working on this manuscript for 738 days now. Hang in there!" + msg_box.setInformativeText(m) + msg_box.setDetailedText('"A long time ago in a galaxy far, far away...."') + msg_box.addButton("&Keep", QMessageBox.AcceptRole) + msg_box.addButton("Delete", QMessageBox.RejectRole) + if msg_box.exec() == QMessageBox.AcceptRole: + self._warning_label.setText("Keep") + else: + self._warning_label.setText("Delete") + + @Slot() + def error_message(self): + m = dedent("""\ + This dialog shows and remembers error messages. If the + user chooses to not show the dialog again, the dialog + will not appear again if QErrorMessage.showMessage() + is called with the same message.""") + self._error_message_dialog.showMessage(m) + m = dedent("""\ + You can queue up error messages, and they will be + shown one after each other. Each message maintains + its own state for whether it will be shown again + the next time QErrorMessage::showMessage() is called + with the same message.""") + self._error_message_dialog.showMessage(m) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + dialog = Dialog() + availableGeometry = dialog.screen().availableGeometry() + dialog.resize(availableGeometry.width() / 3, availableGeometry.height() * 2 / 3) + dialog.move((availableGeometry.width() - dialog.width()) / 2, + (availableGeometry.height() - dialog.height()) / 2) + sys.exit(dialog.exec()) |