0

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

1 回答 1

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使用 a 。

对话窗口是一个顶层窗口,主要用于短期任务和与用户的简短交流。

还有一个特殊性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()
于 2013-04-28T08:01:59.043 回答