PyQt5----自定义Dialog
原因
使用Pyqt作为UI时, 时常想一次性获取多个数据, 但是QInputDialog等一般只接受一个输入源, 多次调用该接口确实可以获取, 但是显得很麻烦
自定义widget也确实可以实现该功能, 但是如果只是简单两三个输入源, 需要用Widget来做, 那就显得有些杀鸡用牛刀了.因此自定义的Dialog才是王道
网络上查了很多也没有找到很完整的, 自己摸索了一下才弄出来自己想要的效果
废话不多说 直接上代码
代码块
def GetUserPlotItems(self) -> tuple:
"""
用来获取需要做曲线的两个Item, 也可以做多个
:return:
"""
dialog = QDialog(self) # 自定义一个dialog
dialog.setWindowTitle('Plot Configs')
formLayout = QFormLayout(dialog) # 配置layout
comboBox1 = QComboBox()
comboBox1.addItems(self.DM.Keys()) # 第一个做曲线的通道名称
formLayout.addRow('First Item', comboBox1)
comboBox1.setCurrentText(self.ChoosedColumnName.currentText())
comboBox2 = QComboBox()
comboBox2.addItems(self.DM.Keys()) # 第二个做曲线的通道名称
formLayout.addRow('Second Item', comboBox2)
comboBox2.setCurrentText(self.ChoosedColumnName.currentText())
# formLayout.addRow(QLabel('Add Range(e.g.: 0:10000): '))
# inputRange = QTextEdit() # 获取范围
# inputRange.setMaximumSize(QtCore.QSize(256, 30))
# formLayout.addRow(inputRange)
StartX = QSpinBox()
StartX.setMaximum(100_0000)
StepX = QSpinBox()
StepX.setMaximum(100_0000)
formLayout.addRow('Start', StartX)
formLayout.addRow('Step ', StepX)
button = QDialogButtonBox(QDialogButtonBox.Ok)
formLayout.addRow(button)
dialog.show()
button.clicked.connect(dialog.accept)
if dialog.exec() == QDialog.Accepted:
return comboBox1.currentText(), comboBox2.currentText(), StartX.text(), StepX.text()
else:
return ()
运行后的结果
这样就完成一个简单的多数据源获取的自定义Dialog
注
几个注意点:
- 绑定信号和槽
button.clicked.connect(dialog.accept)
这里的accept不能够添加括号, 否则会报错 - button也可以用更加常用的PushButton来实现
QDialog.Accepted
一定是大写的A, 跳出的提示也有小写的a, 这里一定要区分, 其实这里就是1
dialog.exec()
这里就相当于widget.exec() 用来保持Dialog不关闭并回去返回的信号