PyQt5标准对话框

很全的Qt的标准对话框,包含QInputDialog、QColorDialog、QFontDialog、QMessageBox、QOpenFileDialog...

全部是由官网的C++版本,转换成PyQt5版本。

有些细节忽略了,因为实在不知怎么转换过来。捣鼓了一晚上,总算完成了,好累啊,不过很开心!

效果图:

PyQt5标准对话框PyQt5标准对话框

 

完整代码:

  1 # -*- coding: utf-8 -*-   
  2 from PyQt5.QtGui import *  
  3 from PyQt5.QtCore import *  
  4 from PyQt5.QtWidgets import *
  5 
  6 import sys  
  7 
  8 
  9 class DialogOptionsWidget(QWidget):
 10     def __init__(self, parent=None):
 11         super(DialogOptionsWidget,self).__init__(parent)
 12 
 13     def addCheckBox(self, text, value):
 14         pass
 15         
 16     def addSpacer():
 17         pass
 18         
 19     def value():
 20         pass
 21 
 22 
 23 class StandardDialog(QDialog):  
 24     def __init__(self,parent=None):  
 25         super(StandardDialog,self).__init__(parent)  
 26           
 27         self.setWindowTitle("Standard Dialog")  
 28         
 29         frameStyle = QFrame.Sunken | QFrame.Panel
 30         
 31         mainLayout = QVBoxLayout(self)
 32         toolbox = QToolBox()
 33         mainLayout.addWidget(toolbox)
 34         
 35         self.errorMessageDialog = QErrorMessage(self)
 36         
 37         pushButton_integer = QPushButton("QInputDialog.get&Int()")
 38         pushButton_double = QPushButton("QInputDialog.get&Double()")
 39         pushButton_item = QPushButton("QInputDialog.getIte&m()")
 40         pushButton_text = QPushButton("QInputDialog.get&Text()")
 41         pushButton_multiLineText = QPushButton("QInputDialog.get&MultiLineText()")
 42         pushButton_color = QPushButton("QColorDialog.get&Color()")
 43         pushButton_font = QPushButton("QFontDialog.get&Font()")
 44         pushButton_directory = QPushButton("QFileDialog.getE&xistingDirectory()")
 45         pushButton_openFileName = QPushButton("QFileDialog.get&OpenFileName()")
 46         pushButton_openFileNames = QPushButton("QFileDialog.&getOpenFileNames()")
 47         pushButton_saveFileName = QPushButton("QFileDialog.get&SaveFileName()")
 48         pushButton_critical = QPushButton("QMessageBox.critica&l()")
 49         pushButton_information = QPushButton("QMessageBox.i&nformation()")
 50         pushButton_question = QPushButton("QQMessageBox.&question()")
 51         pushButton_warning = QPushButton("QMessageBox.&warning()")
 52         pushButton_error = QPushButton("QErrorMessage.showM&essage()")
 53         
 54         self.label_integer = QLabel()
 55         self.label_double = QLabel()
 56         self.label_item = QLabel()
 57         self.label_text = QLabel()
 58         self.label_multiLineText = QLabel()
 59         self.label_color = QLabel()
 60         self.label_font = QLabel()
 61         self.label_directory = QLabel()
 62         self.label_openFileName = QLabel()
 63         self.label_openFileNames = QLabel()
 64         self.label_saveFileName = QLabel()
 65         self.label_critical = QLabel()
 66         self.label_information = QLabel()
 67         self.label_question = QLabel()
 68         self.label_warning = QLabel()
 69         self.label_error = QLabel()
 70         
 71         self.label_integer.setFrameStyle(frameStyle)
 72         self.label_double.setFrameStyle(frameStyle)
 73         self.label_item.setFrameStyle(frameStyle)
 74         self.label_text.setFrameStyle(frameStyle)
 75         self.label_multiLineText.setFrameStyle(frameStyle)
 76         self.label_color.setFrameStyle(frameStyle)
 77         self.label_font.setFrameStyle(frameStyle)
 78         self.label_directory.setFrameStyle(frameStyle)
 79         self.label_openFileName.setFrameStyle(frameStyle)
 80         self.label_openFileNames.setFrameStyle(frameStyle)
 81         self.label_saveFileName.setFrameStyle(frameStyle)
 82         self.label_critical.setFrameStyle(frameStyle)
 83         self.label_information.setFrameStyle(frameStyle)
 84         self.label_question.setFrameStyle(frameStyle)
 85         self.label_warning.setFrameStyle(frameStyle)
 86         self.label_error.setFrameStyle(frameStyle)
 87   
 88         
 89         page = QWidget()
 90         layout = QGridLayout(page)
 91         layout.setColumnStretch(1,1)
 92         layout.setColumnMinimumWidth(1,250)
 93         layout.addWidget(pushButton_integer,0,0)
 94         layout.addWidget(self.label_integer,0,1)
 95         layout.addWidget(pushButton_double,1,0)
 96         layout.addWidget(self.label_double,1,1)
 97         layout.addWidget(pushButton_item,2,0)
 98         layout.addWidget(self.label_item,2,1)
 99         layout.addWidget(pushButton_text,3,0)
100         layout.addWidget(self.label_text,3,1)
101         layout.addWidget(pushButton_multiLineText,4,0)
102         layout.addWidget(self.label_multiLineText,4,1)
103         layout.addItem(QSpacerItem(0,0,QSizePolicy.Ignored,QSizePolicy.MinimumExpanding),5,0)
104         toolbox.addItem(page, "Input Dialog")
105         
106         page = QWidget()
107         layout = QGridLayout(page)
108         layout.setColumnStretch(1,1)
109         #layout.setColumnMinimumWidth(1,250)
110         layout.addWidget(pushButton_color,0,0)
111         layout.addWidget(self.label_color,0,1)
112         colorDialogOptionsWidget = DialogOptionsWidget()
113         colorDialogOptionsWidget.addCheckBox("Do not use native dialog", QColorDialog.DontUseNativeDialog)
114         colorDialogOptionsWidget.addCheckBox("Show alpha channel" , QColorDialog.ShowAlphaChannel)
115         colorDialogOptionsWidget.addCheckBox("No buttons" , QColorDialog.NoButtons)
116         layout.addItem(QSpacerItem(0,0,QSizePolicy.Ignored,QSizePolicy.MinimumExpanding),1,0)
117         layout.addWidget(colorDialogOptionsWidget, 2, 0, 1 ,2)
118         toolbox.addItem(page, "Color Dialog")
119         
120         page = QWidget()
121         layout = QGridLayout(page)
122         layout.setColumnStretch(1, 1)
123         layout.addWidget(pushButton_font, 0, 0)
124         layout.addWidget(self.label_font, 0, 1)
125         fontDialogOptionsWidget = DialogOptionsWidget()
126         fontDialogOptionsWidget.addCheckBox("Do not use native dialog", QFontDialog.DontUseNativeDialog)
127         fontDialogOptionsWidget.addCheckBox("No buttons", QFontDialog.NoButtons)
128         layout.addItem(QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding), 1, 0)
129         layout.addWidget(fontDialogOptionsWidget, 2, 0, 1 ,2)
130         toolbox.addItem(page, "Font Dialog")
131 
132         page = QWidget()
133         layout = QGridLayout(page)
134         layout.setColumnStretch(1, 1)
135         layout.addWidget(pushButton_directory, 0, 0)
136         layout.addWidget(self.label_directory, 0, 1)
137         layout.addWidget(pushButton_openFileName, 1, 0)
138         layout.addWidget(self.label_openFileName, 1, 1)
139         layout.addWidget(pushButton_openFileNames, 2, 0)
140         layout.addWidget(self.label_openFileNames, 2, 1)
141         layout.addWidget(pushButton_saveFileName, 3, 0)
142         layout.addWidget(self.label_saveFileName, 3, 1)
143         fileDialogOptionsWidget = DialogOptionsWidget()
144         fileDialogOptionsWidget.addCheckBox("Do not use native dialog", QFileDialog.DontUseNativeDialog)
145         fileDialogOptionsWidget.addCheckBox("Show directories only", QFileDialog.ShowDirsOnly)
146         fileDialogOptionsWidget.addCheckBox("Do not resolve symlinks", QFileDialog.DontResolveSymlinks)
147         fileDialogOptionsWidget.addCheckBox("Do not confirm overwrite", QFileDialog.DontConfirmOverwrite)
148         fileDialogOptionsWidget.addCheckBox("Do not use sheet", QFileDialog.DontUseSheet)
149         fileDialogOptionsWidget.addCheckBox("Readonly", QFileDialog.ReadOnly)
150         fileDialogOptionsWidget.addCheckBox("Hide name filter details", QFileDialog.HideNameFilterDetails)
151         layout.addItem(QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding), 4, 0)
152         layout.addWidget(fileDialogOptionsWidget, 5, 0, 1 ,2)
153         toolbox.addItem(page, "File Dialogs")
154 
155         page = QWidget()
156         layout = QGridLayout(page)
157         layout.setColumnStretch(1, 1)
158         layout.addWidget(pushButton_critical, 0, 0)
159         layout.addWidget(self.label_critical, 0, 1)
160         layout.addWidget(pushButton_information, 1, 0)
161         layout.addWidget(self.label_information, 1, 1)
162         layout.addWidget(pushButton_question, 2, 0)
163         layout.addWidget(self.label_question, 2, 1)
164         layout.addWidget(pushButton_warning, 3, 0)
165         layout.addWidget(self.label_warning, 3, 1)
166         layout.addWidget(pushButton_error, 4, 0)
167         layout.addWidget(self.label_error, 4, 1)
168         layout.addItem(QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding), 5, 0)
169         toolbox.addItem(page, "Message Boxes")
170         
171         pushButton_integer.clicked.connect(self.setInteger) 
172         pushButton_double.clicked.connect(self.setDouble) 
173         pushButton_item.clicked.connect(self.setItem) 
174         pushButton_text.clicked.connect(self.setText) 
175         pushButton_multiLineText.clicked.connect(self.setMultiLineText) 
176         pushButton_color.clicked.connect(self.setColor) 
177         pushButton_font.clicked.connect(self.setFont) 
178         pushButton_directory.clicked.connect(self.setExistingDirectory) 
179         pushButton_openFileName.clicked.connect(self.setOpenFileName) 
180         pushButton_openFileNames.clicked.connect(self.setOpenFileNames) 
181         pushButton_saveFileName.clicked.connect(self.setSaveFileName) 
182         pushButton_critical.clicked.connect(self.criticalMessage) 
183         pushButton_information.clicked.connect(self.informationMessage) 
184         pushButton_question.clicked.connect(self.questionMessage) 
185         pushButton_warning.clicked.connect(self.warningMessage) 
186         pushButton_error.clicked.connect(self.errorMessage) 
187         
188     #输入对话框 取整数
189     def setInteger(self):
190         intNum, ok = QInputDialog.getInt(self, "QInputDialog.getInteger()","Percentage:", 25, 0, 100, 1)
191         if ok:
192             self.label_integer.setText(str(intNum))
193     
194     #输入对话框 取实数
195     def setDouble(self):
196         doubleNum, ok = QInputDialog.getDouble(self, "QInputDialog.getDouble()", "Amount:", 37.56, -10000, 10000, 2)
197         if ok:
198             self.label_double.setText(str(doubleNum))
199     
200     #输入对话框 取列表项
201     def setItem(self):
202         items = ["Spring", "Summer", "Fall", "Winter"]
203         item, ok = QInputDialog.getItem(self, "QInputDialog.getItem()","Season:", items, 0, False)
204         if ok and item:
205             self.label_item.setText(item)
206     
207     #输入对话框 取文本
208     def setText(self):
209         text, ok = QInputDialog.getText(self, "QInputDialog.getText()", "User name:", QLineEdit.Normal, QDir.home().dirName())
210         if ok and text:
211             self.label_text.setText(text)
212     
213     #输入对话框 取多行文本
214     def setMultiLineText(self):
215         text, ok = QInputDialog.getMultiLineText(self, "QInputDialog.getMultiLineText()", "Address:", "John Doe\nFreedom Street")
216         if ok and text:
217             self.label_multiLineText.setText(text)
218     
219     #颜色对话框 取颜色
220     def setColor(self):
221         #options = QColorDialog.ColorDialogOptions(QFlag.QFlag(colorDialogOptionsWidget.value()))
222         color = QColorDialog.getColor(Qt.green, self, "Select Color")
223 
224         if color.isValid():
225             self.label_color.setText(color.name())
226             self.label_color.setPalette(QPalette(color))
227             self.label_color.setAutoFillBackground(True)
228     
229     #字体对话框 取字体
230     def setFont(self):
231         #options = QFontDialog.FontDialogOptions(QFlag(fontDialogOptionsWidget.value()))
232         #font, ok = QFontDialog.getFont(ok, QFont(self.label_font.text()), self, "Select Font",options)
233         font, ok = QFontDialog.getFont()
234         if ok:
235             self.label_font.setText(font.key())
236             self.label_font.setFont(font)
237     
238     #目录对话框 取目录
239     def setExistingDirectory(self):
240         #options = QFileDialog.Options(QFlag(fileDialogOptionsWidget->value()))
241         #options |= QFileDialog.DontResolveSymlinks | QFileDialog.ShowDirsOnly
242         directory = QFileDialog.getExistingDirectory(self,
243                                     "QFileDialog.getExistingDirectory()",
244                                     self.label_directory.text())
245         if directory:
246             self.label_directory.setText(directory)
247     
248     #打开文件对话框 取文件名
249     def setOpenFileName(self):
250         #options = QFileDialog.Options(QFlag(fileDialogOptionsWidget.value()))
251         #selectedFilter
252         fileName, filetype = QFileDialog.getOpenFileName(self,
253                                     "QFileDialog.getOpenFileName()",
254                                     self.label_openFileName.text(),
255                                     "All Files (*);;Text Files (*.txt)")
256         if fileName:
257             self.label_openFileName.setText(fileName)
258     
259     #打开文件对话框 取一组文件名
260     def setOpenFileNames(self):
261         #options = QFileDialog.Options(QFlag(fileDialogOptionsWidget.value()))
262         #selectedFilter
263         openFilesPath = "D:/documents/pyMarksix/draw/"
264         files, ok = QFileDialog.getOpenFileNames(self,
265                                     "QFileDialog.getOpenFileNames()",
266                                     openFilesPath,
267                                     "All Files (*);;Text Files (*.txt)")
268 
269         if len(files):
270             self.label_openFileNames.setText(", ".join(files))
271     
272     #保存文件对话框 取文件名
273     def setSaveFileName(self):
274         #options = QFileDialog.Options(QFlag(fileDialogOptionsWidget.value()))
275         #selectedFilter
276         fileName, ok = QFileDialog.getSaveFileName(self,
277                                     "QFileDialog.getSaveFileName()",
278                                     self.label_saveFileName.text(),
279                                     "All Files (*);;Text Files (*.txt)")
280         if fileName:
281             self.label_saveFileName.setText(fileName)
282         
283     def criticalMessage(self):
284         #reply = QMessageBox.StandardButton()
285         MESSAGE = "批评!"
286         reply = QMessageBox.critical(self,
287                                     "QMessageBox.critical()",
288                                     MESSAGE,
289                                     QMessageBox.Abort | QMessageBox.Retry | QMessageBox.Ignore)
290         if reply == QMessageBox.Abort:
291             self.label_critical.setText("Abort")
292         elif reply == QMessageBox.Retry:
293             self.label_critical.setText("Retry")
294         else:
295             self.label_critical.setText("Ignore")
296         
297     def informationMessage(self):
298         MESSAGE = "信息"
299         reply = QMessageBox.information(self, "QMessageBox.information()", MESSAGE)
300         if reply == QMessageBox.Ok:
301             self.label_information.setText("OK")
302         else:
303             self.label_information.setText("Escape")
304         
305     def questionMessage(self):
306         MESSAGE = "疑问"
307         reply = QMessageBox.question(self, "QMessageBox.question()",
308                                     MESSAGE,
309                                     QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
310         if reply == QMessageBox.Yes:
311             self.label_question.setText("Yes")
312         elif reply == QMessageBox.No:
313             self.label_question.setText("No")
314         else:
315             self.label_question.setText("Cancel")
316         
317     def warningMessage(self):
318         MESSAGE = "警告文本"
319         msgBox = QMessageBox(QMessageBox.Warning,
320                             "QMessageBox.warning()",
321                              MESSAGE,
322                              QMessageBox.Retry | QMessageBox.Discard | QMessageBox.Cancel,
323                              self)
324         msgBox.setDetailedText("详细信息。。。")
325         #msgBox.addButton("Save &Again", QMessageBox.AcceptRole)
326         #msgBox.addButton("&Continue", QMessageBox.RejectRole)
327         if msgBox.exec() == QMessageBox.AcceptRole:
328             self.label_warning.setText("Retry")
329         else:
330             self.label_warning.setText("Abort")
331         
332     def errorMessage(self):
333         self.errorMessageDialog.showMessage(
334                    "This dialog shows and remembers error messages. "
335                    "If the checkbox is checked (as it is by default), "
336                    "the shown message will be shown again, "
337                    "but if the user unchecks the box the message "
338                    "will not appear again if QErrorMessage.showMessage() "
339                    "is called with the same message.")
340         self.label_error.setText("If the box is unchecked, the message "
341                                "won't appear again.")
342 
343 app=QApplication(sys.argv)  
344 form=StandardDialog()  
345 form.show()  
346 app.exec_()  

 

上一篇:如何实现PyQt5与QML响应彼此发送的信号?


下一篇:QtWidgets Module's Classes