basic/dialogs_start.py
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
button = QPushButton("Press me for a dialog!")
button.clicked.connect(self.button_clicked)
self.setCentralWidget(button)
def button_clicked(self, s):
print("click", s)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
Dialog
Dialog 실행
basic/dialogs_1.py
QDialog를 실행하면 대화 상자에 특정한 완전히 새로운 이벤트 루프가 생성됩니다.
def button_clicked(self, s):
print("click", s)
dlg = QDialog(self)
dlg.setWindowTitle("?")
dlg.exec()
To customize the QDialog
basic/dialogs_2a.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QDialog,
QDialogButtonBox,
QLabel,
QMainWindow,
QPushButton,
QVBoxLayout,
)
class CustomDialog(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("HELLO!")
buttons = (
QDialogButtonBox.StandardButton.Ok
| QDialogButtonBox.StandardButton.Cancel
)
self.buttonBox = QDialogButtonBox(buttons)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
self.layout = QVBoxLayout()
message = QLabel("Something happened, is that OK?")
self.layout.addWidget(message)
self.layout.addWidget(self.buttonBox)
self.setLayout(self.layout)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
button = QPushButton("Press me for a dialog!")
button.clicked.connect(self.button_clicked)
self.setCentralWidget(button)
# tag::button_clicked[]
def button_clicked(self, s):
print("click", s)
dlg = CustomDialog()
if dlg.exec():
print("Success!")
else:
print("Cancel!")
# end::button_clicked[]
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
Table 1. QDialogButtonBox available button types.
Button types | |
QDialogButtonBox.Ok | QDialogButtonBox.Open |
QDialogButtonBox.Save | QDialogButtonBox.Cancel |
QDialogButtonBox.Close | QDialogButtonBox.Discard |
QDialogButtonBox.Apply | QDialogButtonBox.Reset |
QDialogButtonBox.RestoreDefaults | QDialogButtonBox.Help |
QDialogButtonBox.SaveAll | QDialogButtonBox.Yes |
QDialogButtonBox.YesToAll | QDialogButtonBox.No |
QDialogButtonBox.NoToAll | QDialogButtonBox.Abort |
QDialogButtonBox.Retry | QDialogButtonBox.Ignore |
QDialogButtonBox.NoButton |
class CustomDialog(QDialog):
def __init__(self, parent=None): # <1>
super().__init__(parent)
.....
class MainWindow(QMainWindow):
......
def button_clicked(self, s):
print("click", s)
dlg = CustomDialog(self)
........
QMessageBox
Message dialogs with QMessageBox
basic/dialogs_3.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QDialog,
QMainWindow,
QMessageBox,
QPushButton,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
button = QPushButton("Press me for a dialog!")
button.clicked.connect(self.button_clicked)
self.setCentralWidget(button)
# tag::button_clicked[]
def button_clicked(self, s):
dlg = QMessageBox(self)
dlg.setWindowTitle("I have a question!")
dlg.setText("This is a simple dialog")
button = dlg.exec()
# Look up the button enum entry for the result.
button = QMessageBox.StandardButton(button)
if button == QMessageBox.StandardButton.Ok:
print("OK!")
# end::button_clicked[]
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
QMessageBox available button types.
Button types | ||
QMessageBox.Ok | QMessageBox.Open | QMessageBox.Save |
QMessageBox.Cancel | QMessageBox.Close | QMessageBox.Discard |
QMessageBox.Apply | QMessageBox.Reset | QMessageBox.RestoreDefaults |
QMessageBox.Help | QMessageBox.SaveAll | QMessageBox.Yes |
QMessageBox.YesToAll | QMessageBox.No | QMessageBox.NoToAll |
QMessageBox.Abort | QMessageBox.Retry | QMessageBox.Ignore |
QMessageBox.NoButton |
Table 3. QMessageBox icon constants.
Icon state | Description |
QMessageBox.NoIcon | The message box does not have an icon. |
QMessageBox.Question | The message is asking a question. |
QMessageBox.Information | The message is informational only. |
QMessageBox.Warning | The message is warning. |
QMessageBox.Critical | The message indicates a critical problem. |
basic/dialogs_4.py
버튼 /아이콘 설정
def button_clicked(self, s):
dlg = QMessageBox(self)
dlg.setWindowTitle("I have a question!")
dlg.setText("This is a question dialog")
dlg.setStandardButtons(
QMessageBox.StandardButton.Yes
| QMessageBox.StandardButton.No
)
dlg.setIcon(QMessageBox.Icon.Question)
button = dlg.exec()
# Look up the button enum entry for the result.
button = QMessageBox.StandardButton(button)
if button == QMessageBox.StandardButton.Yes:
print("Yes!")
else:
print("No!")
# end::button_clicked[]
Standard QMessageBox dialogs
QMessageBox.about(parent, title, message) QMessageBox.critical(parent, title, message) QMessageBox.information(parent, title, message) QMessageBox.question(parent, title, message) QMessageBox.warning(parent, title, message) |
import sys
from PyQt6.QtWidgets import (
QApplication,
QDialog,
QMainWindow,
QMessageBox,
QPushButton,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
button = QPushButton("Press me for a dialog!")
button.clicked.connect(self.button_clicked)
self.setCentralWidget(button)
# tag::button_clicked[]
def button_clicked(self, s):
button = QMessageBox.question(
self, "Question dialog", "The longer message"
)
if button == QMessageBox.StandardButton.Yes:
print("Yes!")
else:
print("No!")
# end::button_clicked[]
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
exec()를 호출하는 대신 이제 단순히 대화 상자 메서드를 호출하면 대화 상자가 생성됩니다. 각 메서드의 반환 값은 누른 버튼입니다. 반환 값을 표준 버튼 상수와 비교하여 눌린 내용을 감지 할 수 있습니다.
basic/dialogs_6.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QDialog,
QMainWindow,
QMessageBox,
QPushButton,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
button = QPushButton("Press me for a dialog!")
button.clicked.connect(self.button_clicked)
self.setCentralWidget(button)
# tag::button_clicked[]
def button_clicked(self, s):
button = QMessageBox.question(
self, "Question dialog", "The longer message"
)
if button == QMessageBox.StandardButton.Yes:
print("Yes!")
else:
print("No!")
# end::button_clicked[]
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
QInputDialog
Asking for single values
basic/dialogs_input_1.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QInputDialog,
QMainWindow,
QPushButton,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
button1 = QPushButton("Integer")
button1.clicked.connect(self.get_an_int)
self.setCentralWidget(button1)
def get_an_int(self):
my_int_value, ok = QInputDialog.getInt(
self, "Get an integer", "Enter a number"
)
print("Result:", ok, my_int_value)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
basic/dialogs_input_3.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QInputDialog,
QLineEdit,
QMainWindow,
QPushButton,
QVBoxLayout,
QWidget,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
layout = QVBoxLayout()
button1 = QPushButton("Integer")
button1.clicked.connect(self.get_an_int)
layout.addWidget(button1)
button2 = QPushButton("Float")
button2.clicked.connect(self.get_a_float)
layout.addWidget(button2)
button3 = QPushButton("Select")
button3.clicked.connect(self.get_a_str_from_a_list)
layout.addWidget(button3)
button4 = QPushButton("String")
button4.clicked.connect(self.get_a_str)
layout.addWidget(button4)
button5 = QPushButton("Text")
button5.clicked.connect(self.get_text)
layout.addWidget(button5)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
# tag::get_an_int[]
def get_an_int(self):
title = "Enter an integer"
label = "Type your integer here"
my_int_value, ok = QInputDialog.getInt(
self, title, label, value=0, min=-5, max=5, step=1
)
print("Result:", ok, my_int_value)
# end::get_an_int[]
# tag::get_a_float[]
def get_a_float(self):
title = "Enter a float"
label = "Type your float here"
my_float_value, ok = QInputDialog.getDouble(
self,
title,
label,
value=0,
min=-5.3,
max=5.7,
decimals=2,
)
print("Result:", ok, my_float_value)
# end::get_a_float[]
# tag::get_a_str_from_a_list[]
def get_a_str_from_a_list(self):
title = "Select a string"
label = "Select a fruit from the list"
items = ["apple", "pear", "orange", "grape"]
initial_selection = 2 # orange, indexed from 0
my_selected_str, ok = QInputDialog.getItem(
self,
title,
label,
items,
current=initial_selection,
editable=False,
)
print("Result:", ok, my_selected_str)
# end::get_a_str_from_a_list[]
# tag::get_a_str[]
def get_a_str(self):
title = "Enter a string"
label = "Type your password"
text = "my secret password"
mode = QLineEdit.EchoMode.Password
my_selected_str, ok = QInputDialog.getText(
self, title, label, mode, text
)
print("Result:", ok, my_selected_str)
# end::get_a_str[]
# tag::get_text[]
def get_text(self):
title = "Enter text"
label = "Type your novel here"
text = "Once upon a time..."
my_selected_str, ok = QInputDialog.getMultiLineText(
self, title, label, text
)
print("Result:", ok, my_selected_str)
# end::get_text[]
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
Working with QInputDialog instances
basic/dialogs_input_instance.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QInputDialog,
QLineEdit,
QMainWindow,
QPushButton,
QVBoxLayout,
QWidget,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
layout = QVBoxLayout()
button1 = QPushButton("Integer")
button1.clicked.connect(self.get_an_int)
layout.addWidget(button1)
button2 = QPushButton("Float")
button2.clicked.connect(self.get_a_float)
layout.addWidget(button2)
button3 = QPushButton("Select")
button3.clicked.connect(self.get_a_str_from_a_list)
layout.addWidget(button3)
button4 = QPushButton("String")
button4.clicked.connect(self.get_a_str)
layout.addWidget(button4)
button5 = QPushButton("Text")
button5.clicked.connect(self.get_text)
layout.addWidget(button5)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def get_an_int(self):
dialog = QInputDialog(self)
dialog.setWindowTitle("Enter an integer")
dialog.setLabelText("Type your integer here")
dialog.setIntValue(0)
dialog.setIntMinimum(-5)
dialog.setIntMaximum(5)
dialog.setIntStep(1)
ok = dialog.exec()
print("Result:", ok, dialog.intValue())
def get_a_float(self):
dialog = QInputDialog(self)
dialog.setWindowTitle("Enter a float")
dialog.setLabelText("Type your float here")
dialog.setDoubleValue(0.1)
dialog.setDoubleMinimum(-5.3)
dialog.setDoubleMaximum(5.7)
dialog.setDoubleStep(1.4)
dialog.setDoubleDecimals(2)
ok = dialog.exec()
print("Result:", ok, dialog.doubleValue())
def get_a_str_from_a_list(self):
dialog = QInputDialog(self)
dialog.setWindowTitle("Select a string")
dialog.setLabelText("Select a fruit from the list")
dialog.setComboBoxItems(["apple", "pear", "orange", "grape"])
dialog.setComboBoxEditable(False)
dialog.setTextValue("orange")
ok = dialog.exec()
print("Result:", ok, dialog.textValue())
def get_a_str(self):
dialog = QInputDialog(self)
dialog.setWindowTitle("Enter a string")
dialog.setLabelText("Type your password")
dialog.setTextValue("my secret password")
dialog.setTextEchoMode(QLineEdit.EchoMode.Password)
ok = dialog.exec()
print("Result:", ok, dialog.textValue())
def get_text(self):
dialog = QInputDialog(self)
dialog.setWindowTitle("Enter text")
dialog.setLabelText("Type your novel here")
dialog.setTextValue("Once upon a time...")
dialog.setOption(
QInputDialog.InputDialogOption.UsePlainTextEditForTextInput,
True,
)
ok = dialog.exec()
print("Result:", ok, dialog.textValue())
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
File dialogs
basic/dialogs_file_1.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QFileDialog,
QMainWindow,
QPushButton,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
button1 = QPushButton("Open file")
button1.clicked.connect(self.get_filename)
self.setCentralWidget(button1)
def get_filename(self):
filename, selected_filter = QFileDialog.getOpenFileName(self)
print("Result:", filename, selected_filter)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
File filters
basic/dialogs_file_2.py
def get_filename(self):
filters = "Portable Network Graphics files (*.png);;Comma Separated Values (*.csv);;All files (*)"
print("Filters are:", filters)
filename, selected_filter = QFileDialog.getOpenFileName(
self,
filter=filters,
)
print("Result:", filename, selected_filter)
# end::get_filename[]
basic/dialogs_file_2b.py
FILE_FILTERS = [
"Portable Network Graphics files (*.png)",
"Text files (*.txt)",
"Comma Separated Values (*.csv)",
"All files (*)",
]
.......
class MainWindow(QMainWindow):
......
def get_filename(self):
initial_filter = FILE_FILTERS[3] # Select one from the list.
filters = ";;".join(FILE_FILTERS)
print("Filters are:", filters)
print("Initial filter:", initial_filter)
filename, selected_filter = QFileDialog.getOpenFileName(
self,
filter=filters,
initialFilter=initial_filter,
)
print("Result:", filename, selected_filter)
......
Configuring file dialogs
basic/dialogs_file_3.py
basic/dialogs_file_4.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QFileDialog,
QMainWindow,
QPushButton,
QVBoxLayout,
QWidget,
)
FILE_FILTERS = [
"Portable Network Graphics files (*.png)",
"Text files (*.txt)",
"Comma Separated Values (*.csv)",
"All files (*)",
]
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
layout = QVBoxLayout()
button1 = QPushButton("Open file")
button1.clicked.connect(self.get_filename)
layout.addWidget(button1)
button2 = QPushButton("Open files")
button2.clicked.connect(self.get_filenames)
layout.addWidget(button2)
button3 = QPushButton("Save file")
button3.clicked.connect(self.get_save_filename)
layout.addWidget(button3)
button4 = QPushButton("Select folder")
button4.clicked.connect(self.get_folder)
layout.addWidget(button4)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
# tag::get_filename[]
def get_filename(self):
caption = "" # Empty uses default caption.
initial_dir = "" # Empty uses current folder.
initial_filter = FILE_FILTERS[3] # Select one from the list.
filters = ";;".join(FILE_FILTERS)
print("Filters are:", filters)
print("Initial filter:", initial_filter)
filename, selected_filter = QFileDialog.getOpenFileName(
self,
caption=caption,
directory=initial_dir,
filter=filters,
initialFilter=initial_filter,
)
print("Result:", filename, selected_filter)
# end::get_filename[]
# tag::get_filenames[]
def get_filenames(self):
caption = "" # Empty uses default caption.
initial_dir = "" # Empty uses current folder.
initial_filter = FILE_FILTERS[1] # Select one from the list.
filters = ";;".join(FILE_FILTERS)
print("Filters are:", filters)
print("Initial filter:", initial_filter)
filenames, selected_filter = QFileDialog.getOpenFileNames(
self,
caption=caption,
directory=initial_dir,
filter=filters,
initialFilter=initial_filter,
)
print("Result:", filenames, selected_filter)
# end::get_filenames[]
# tag::get_save_filename[]
def get_save_filename(self):
caption = "" # Empty uses default caption.
initial_dir = "" # Empty uses current folder.
initial_filter = FILE_FILTERS[2] # Select one from the list.
filters = ";;".join(FILE_FILTERS)
print("Filters are:", filters)
print("Initial filter:", initial_filter)
filename, selected_filter = QFileDialog.getSaveFileName(
self,
caption=caption,
directory=initial_dir,
filter=filters,
initialFilter=initial_filter,
)
print("Result:", filename, selected_filter)
# end::get_save_filename[]
# tag::get_folder[]
def get_folder(self):
caption = "" # Empty uses default caption.
initial_dir = "" # Empty uses current folder.
folder_path = QFileDialog.getExistingDirectory(
self,
caption=caption,
directory=initial_dir,
)
print("Result:", folder_path)
# end::get_folder[]
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
basic/dialogs_file_4b.py
Open a file
if filename:
with open(filename, "r") as f:
file_contents = f.read()
# end::get_filename[]
Open multiple files
(filenames, selected_filter,) = QFileDialog.getOpenFileNames(
self,
caption=caption,
directory=initial_dir,
filter=filters,
initialFilter=initial_filter,
)
print("Result:", filenames, selected_filter)
# tag::get_filenames[]
for filename in filenames:
with open(filename, "r") as f:
file_contents = f.read()
# end::get_filenames[]
Save a file
if filename:
if os.path.exists(filename):
# Existing file, ask the user for confirmation.
write_confirmed = QMessageBox.question(
self,
"Overwrite file?",
f"The file {filename} exists. Are you sure you want to overwrite it?",
)
else:
# File does not exist, always-confirmed.
write_confirmed = True
if write_confirmed:
with open(filename, "w") as f:
file_content = "YOUR FILE CONTENT"
f.write(file_content)
# end::get_save_filename[]
Select a folder
def get_folder(self):
caption = "" # Empty uses default caption.
initial_dir = "" # Empty uses current folder.
folder_path = QFileDialog.getExistingDirectory(
self,
caption=caption,
directory=initial_dir,
)
print("Result:", folder_path)
Qt also provides some less-commonly used dialogs for showing progress bars (QProgressDialog), one-off error messages(QErrorMessage), selecting colors (QColorDialog), selecting fonts(QFontDialog) and displaying wizards to guide users through tasks (QWizard). See the Qt documentation for details.
basic/dialogs_file_instance.py
import sys
from PyQt6.QtWidgets import (
QApplication,
QFileDialog,
QLineEdit,
QMainWindow,
QPushButton,
QVBoxLayout,
QWidget,
)
FILE_FILTERS = [
"Portable Network Graphics files (*.png)",
"Text files (*.txt)",
"Comma Separated Values (*.csv)",
"All files (*)",
]
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
layout = QVBoxLayout()
button1 = QPushButton("Open file")
button1.clicked.connect(self.get_filename)
layout.addWidget(button1)
button2 = QPushButton("Open files")
button2.clicked.connect(self.get_filenames)
layout.addWidget(button2)
button3 = QPushButton("Save file")
button3.clicked.connect(self.get_save_filename)
layout.addWidget(button3)
button4 = QPushButton("Select folder")
button4.clicked.connect(self.get_folder)
layout.addWidget(button4)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def get_filename(self):
caption = "Open file"
initial_dir = "" # Empty uses current folder.
initial_filter = FILE_FILTERS[3] # Select one from the list.
dialog = QFileDialog()
dialog.setWindowTitle(caption)
dialog.setDirectory(initial_dir)
dialog.setNameFilters(FILE_FILTERS)
dialog.selectNameFilter(initial_filter)
dialog.setFileMode(QFileDialog.FileMode.ExistingFile)
ok = dialog.exec()
print(
"Result:",
ok,
dialog.selectedFiles(),
dialog.selectedNameFilter(),
)
def get_filenames(self):
caption = "Open files"
initial_dir = "" # Empty uses current folder.
initial_filter = FILE_FILTERS[1] # Select one from the list.
dialog = QFileDialog()
dialog.setWindowTitle(caption)
dialog.setDirectory(initial_dir)
dialog.setNameFilters(FILE_FILTERS)
dialog.selectNameFilter(initial_filter)
dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)
ok = dialog.exec()
print(
"Result:",
ok,
dialog.selectedFiles(),
dialog.selectedNameFilter(),
)
def get_save_filename(self):
caption = "Save As"
initial_dir = "" # Empty uses current folder.
initial_filter = FILE_FILTERS[1] # Select one from the list.
dialog = QFileDialog()
dialog.setWindowTitle(caption)
dialog.setDirectory(initial_dir)
dialog.setNameFilters(FILE_FILTERS)
dialog.selectNameFilter(initial_filter)
dialog.setFileMode(QFileDialog.FileMode.AnyFile)
ok = dialog.exec()
print(
"Result:",
ok,
dialog.selectedFiles(),
dialog.selectedNameFilter(),
)
def get_folder(self):
caption = "Select folder"
initial_dir = "" # Empty uses current folder.
dialog = QFileDialog()
dialog.setWindowTitle(caption)
dialog.setDirectory(initial_dir)
dialog.setFileMode(QFileDialog.FileMode.Directory)
ok = dialog.exec()
print(
"Result:",
ok,
dialog.selectedFiles(),
dialog.selectedNameFilter(),
)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
댓글