在应用PyQt5设计GUI界面时,经常会遇到输入或选择多个参数的问题,把它写到一个窗体中,会显得主窗体很臃肿。所以一般是添加一个按钮,调用对话框,将这些参数选择放入弹出的对话框中,关闭对话框时将参数值返回给主窗体。实现方法是应用PyQt5中 PyQt5.QtWidgets中QDialog类。其中PyQt5内部实现了一些诸如QInputDialog等标准对话框,这些标准对话框都继承自QDialog。在另一些情况我们需要自己写一些自定义对话框并将对话框中的某些值传送到主窗口内。
例如,我在工程中需要通过对话框设置文件的路径并将参数传送到主窗口,可以选择内置的QInputDialog直接输入路径传送,也可以选择QFileDialog调用文件对话框选择文件直接返回文件绝对路径。在实际使用中我们常把这两种结合在一起使用。功能为打开一自定义对话框,可点击按钮调用QfileDialog调用文件对话框选择文件,文件路径返回到文本框上显示并传递到主窗口,也可通过再文本框内直接输入文件绝对路径。
1 class DbPathDialog(QDialog, Ui_dbpathDialog): 2 3 def __init__(self, parent=None): 4 super().__init__(parent) 5 self.setupUi(self) # 窗口界面 6 self.openfileButton.clicked.connect(self.set_db_path) # 定义了一个openfileButton 点击时将信号发送到self.set_db_path槽函数 7 self.filename = os.path.join(os.getcwd(), 'Setting.db') # 定义了一个文件的默认地址 8 if not os.path.exists(self.filename): # 当该路径不存在时调用self.set_db_path() 9 self.set_db_path() 10 else: 11 self.lineEdit.setText(self.filename) # 当该路径存在时文件路径默认为默认路径 12 13 @pyqtSlot() # 槽函数,okButton点击时触发 14 def on_okButton_clicked(self): 15 if not os.path.isfile(self.lineEdit.text()): # 判断路径是否是文件 16 info = self.lineEdit.text() + ' is not an available file' 17 prompt = QMessageBox.information(self, '提示', info, QMessageBox.Ok, QMessageBox.Ok) 18 self.set_db_path() 19 else: 20 self.close() 21 22 def set_db_path(self): 23 '''打开文件对话框,并把选择文件的路径设置再lineEdit文本输入框上''' 24 self.filename = QFileDialog.getOpenFileName(self, 25 r'选择配置文件', 26 r'', 27 r'db Files(*.db)') 28 if self.filename[0] != '': 29 self.lineEdit.setText(self.filename[0]) 30 31 def db_path(self): 32 return self.lineEdit.text() 33 34 @staticmethod 35 def get_db_path(parent = None): 36 '''在静态函数中实例化该类,并调用.exec_()函数来显示执行这个对话框。实现值传递''' 37 dialog = DbPathDialog(parent) 38 result = dialog.exec_() 39 path = dialog.db_path() 40 return path
在主窗口中调用静态函数方法,就可以得到传递的参数值,代码如下:
1 path = DbPathDialog.get_db_path()
第二种调用方法:直接在主窗口程序中实例化该对话框,然后调用该对话框的函数来获取返回值。
1 dlg = DbPathDialog() 2 result = dlg.exec_() 3 path = dialog.db_path() 4 dlg.destroy()
这两种方法的本质都是实例化对话框类,调用该对话框的函数获取需要的值,而使用静态函数方法只是将这些过程进行的封装。