通过QDialog编辑字典不返回正确的数据

时间:2013-04-27 18:34:24

标签: dictionary pyqt

试图理解如何将字典传递给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$ 

1 个答案:

答案 0 :(得分:0)

  1. 类应具有CamelCase名称:GridDialog而不是grid_dialog

  2. 您致电课程grid_dialog但是从QtGui.QWidget继承?通常用于显示带有字段的表单,用于设置一些数据QDialog

  3. 这是错误的:

    def discardAttributes(self):
        QtGui.QDialog.close(self)
    

    首先,因为第2点。其次,你可以使用self.close()

  4. 如果使用以下内容,您可以使代码更具可读性:

    def __init__(self, **orig_attr):
        super(grid_dialog, self).__init__()
        self.initUI(**orig_attr)
    
    def initUI(self, name, shape, unit, ...):
        ...
    
  5. 要将一些数据传递到对话框并从中获取一些结果,通常会使用QDialog

  6.   

    对话窗口是一个主要用于短期任务的顶级窗口   并与用户进行简短的沟通。

    QDialog的一个特点是它可以是acceptedrejected。当接受/拒绝模态对话框时,您将获得相应的返回代码,窗口未关闭,但只是隐藏,因此您可以从对话框中读取所有值。

    因此,您需要从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()