试图理解如何将字典传递给QDialog函数并取回已编辑的字典,我已经搜索但找不到任何我可以遵循的内容。 我正在使用模态调用,所以我需要在继续之前关闭对话框。
到目前为止,问题是应用程序到了returnAttributes()函数,此时它会输出意外的字符串并且不会关闭。
dialog_grid.py
#!/usr/bin/env python
import sys
from PyQt4 import QtGui, QtCore
class grid_dialog(QtGui.QWidget):
def __init__(self, **orig_attr):
super(grid_dialog, self).__init__()
self.initUI(**orig_attr)
def initUI(self, **orig_attr):
self.new_attr = orig_attr.copy()
nameLabel = QtGui.QLabel("Name:")
self.new_attr["name"] = QtGui.QLineEdit(orig_attr["name"])
nameBox = QtGui.QHBoxLayout()
nameBox.addStretch(1)
nameBox.addWidget(nameLabel)
nameBox.addWidget(self.new_attr["name"])
shapeLabel = QtGui.QLabel("Shape:")
self.new_attr["shape"] = QtGui.QLineEdit(orig_attr["shape"])
shapeBox = QtGui.QHBoxLayout()
shapeBox.addStretch(1)
shapeBox.addWidget(shapeLabel)
shapeBox.addWidget(self.new_attr["shape"])
unitLabel = QtGui.QLabel("Unit:")
self.new_attr["unit"] = QtGui.QLineEdit(orig_attr["unit"])
unitBox = QtGui.QHBoxLayout()
unitBox.addStretch(1)
unitBox.addWidget(unitLabel)
unitBox.addWidget(self.new_attr["unit"])
scaleLabel = QtGui.QLabel("Scale:")
self.new_attr["scale"] = QtGui.QLineEdit(orig_attr["scale"])
scaleBox = QtGui.QHBoxLayout()
scaleBox.addStretch(1)
scaleBox.addWidget(scaleLabel)
scaleBox.addWidget(self.new_attr["scale"])
depthLabel = QtGui.QLabel("Depth:")
self.new_attr["depth"] = QtGui.QLineEdit(orig_attr["depth"])
depthBox = QtGui.QHBoxLayout()
depthBox.addStretch(1)
depthBox.addWidget(depthLabel)
depthBox.addWidget(self.new_attr["depth"])
planeLabel = QtGui.QLabel("Plane:")
self.new_attr["plane"] = QtGui.QLineEdit(orig_attr["plane"])
planeBox = QtGui.QHBoxLayout()
planeBox.addStretch(1)
planeBox.addWidget(planeLabel)
planeBox.addWidget(self.new_attr["plane"])
originLabel = QtGui.QLabel("Origin:")
self.new_attr["origin"] = QtGui.QLineEdit(orig_attr["origin"])
originBox = QtGui.QHBoxLayout()
originBox.addStretch(1)
originBox.addWidget(originLabel)
originBox.addWidget(self.new_attr["origin"])
acceptButton = QtGui.QPushButton('Accept')
acceptButton.clicked.connect(self.returnAttributes)
cancelButton = QtGui.QPushButton('Cancel')
cancelButton.clicked.connect(self.discardAttributes)
actionBox = QtGui.QHBoxLayout()
actionBox.addStretch(1)
actionBox.addWidget(acceptButton)
actionBox.addWidget(cancelButton)
attribBox = QtGui.QVBoxLayout()
attribBox.addStretch(1)
attribBox.addLayout(nameBox)
attribBox.addLayout(shapeBox)
attribBox.addLayout(unitBox)
attribBox.addLayout(scaleBox)
attribBox.addLayout(depthBox)
attribBox.addLayout(planeBox)
attribBox.addLayout(originBox)
attribBox.addLayout(actionBox)
self.setLayout(attribBox)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Attributes')
self.show()
# this is not working
def returnAttributes(self):
print self.new_attr
return self.new_attr
QtGui.QDialog.close(self)
def discardAttributes(self):
QtGui.QDialog.close(self)
def main():
# Test case
app = QtGui.QApplication(sys.argv)
part_attr = {}
part_attr["name"] = "name1"
part_attr["shape"] = "shape1"
part_attr["unit"] = "unit1"
part_attr["scale"] = "scale1"
part_attr["depth"] = "depth1"
part_attr["plane"] = "plane1"
part_attr["origin"] = "origin1"
part_attr["action"] = "action1"
# Print original data
print part_attr
# Edit data
part_attr = grid_dialog(**part_attr)
# Print edited data
print part_attr
sys.exit(app.exec_())
if __name__ == "__main__":
main()
scipt的输出:
emos@bob:~/Python_scripts/dialog$ ./dialog_grid.py
{'origin': 'origin1', 'scale': 'scale1', 'name': 'name1', 'shape': 'shape1', 'depth': 'depth1', 'plane': 'plane1', 'action': 'action1', 'unit': 'unit1'}
<__main__.grid_dialog object at 0xb70a64ac>
{'origin': <PyQt4.QtGui.QLineEdit object at 0xb70a6a4c>, 'scale': <PyQt4.QtGui.QLineEdit object at 0xb70a67c4>, 'name': <PyQt4.QtGui.QLineEdit object at 0xb70a653c>, 'depth': <PyQt4.QtGui.QLineEdit object at 0xb70a689c>, 'shape': <PyQt4.QtGui.QLineEdit object at 0xb70a6614>, 'plane': <PyQt4.QtGui.QLineEdit object at 0xb70a6974>, 'action': 'action1', 'unit': <PyQt4.QtGui.QLineEdit object at 0xb70a66ec>}
emos@bob:~/Python_scripts/dialog$
答案 0 :(得分:0)
类应具有CamelCase名称:GridDialog
而不是grid_dialog
您致电课程grid_dialog
但是从QtGui.QWidget
继承?通常用于显示带有字段的表单,用于设置一些数据QDialog
。
这是错误的:
def discardAttributes(self):
QtGui.QDialog.close(self)
首先,因为第2点。其次,你可以使用self.close()
如果使用以下内容,您可以使代码更具可读性:
def __init__(self, **orig_attr):
super(grid_dialog, self).__init__()
self.initUI(**orig_attr)
def initUI(self, name, shape, unit, ...):
...
要将一些数据传递到对话框并从中获取一些结果,通常会使用QDialog
。
对话窗口是一个主要用于短期任务的顶级窗口 并与用户进行简短的沟通。
QDialog
的一个特点是它可以是accepted
或rejected
。当接受/拒绝模态对话框时,您将获得相应的返回代码,但窗口未关闭,但只是隐藏,因此您可以从对话框中读取所有值。
因此,您需要从QDialog
继承您的课程并更改
acceptButton.clicked.connect(self.returnAttributes)
cancelButton.clicked.connect(self.discardAttributes)
到
acceptButton.clicked.connect(self.accept)
cancelButton.clicked.connect(self.reject)
同样改变:
nameLabel = QtGui.QLabel("Name:")
self.new_attr["name"] = QtGui.QLineEdit(orig_attr["name"])
nameBox = QtGui.QHBoxLayout()
nameBox.addStretch(1)
nameBox.addWidget(nameLabel)
nameBox.addWidget(self.new_attr["name"])
到
nameLabel = QtGui.QLabel("Name:")
self.nameEdit = QtGui.QLineEdit(name)
nameBox = QtGui.QHBoxLayout()
nameBox.addStretch(1)
nameBox.addWidget(nameLabel)
nameBox.addWidget(self.nameEdit)
然后使用类似的东西:
dialog = GridDialog(...)
return_code = dialog.exec()
if return_code == QtGui.QDialog.Accepted:
# get the data
dialog.nameEdit.text()