试图了解如何将字典传递给 QDialog 函数并取回已编辑的字典,我已经搜索但找不到任何可以遵循的内容。我正在使用模态调用,因此我需要在继续之前关闭对话框。
到目前为止的问题是应用程序到达 returnAttributes() 函数,此时它会打印出意外的字符串并且不会关闭。
对话框网格.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$