【发布时间】:2019-06-12 22:39:48
【问题描述】:
在动态表上进行单元格验证的推荐方法。
场景:我有一个 QDialog,其中基于不同的下拉选择动态添加 1 个或多个表。因为表格是动态添加的,所以标准单元格点击信号是不够的。它只提供了行和列,除了行和列之外,我还需要知道点击了哪个表。更具体地说,我有 2 列具有整数值。当其中一列的单元格发生变化时,它们必须在有效范围内,并且第二列单元格的值必须>=第一列单元格的值。
我对 Python 还很陌生,但我的想法是我需要创建一个类,用我需要的附加信息扩展 QTableWidgetItem 并发送一个自定义信号,然后我可以将其连接到对话框中的一个插槽.我已经尝试了以下代码的几种变体,但无法完全正确:
class SmartCell(QtCore.QObject):
valueChanged = QtCore.pyqtSignal(str) # Signal to be emitted when value changes.
def __init__(self, tbl, rowname, colname, value):
QtGui.QTableWidgetItem.__init__(self)
self.tbl_name = tbl
self.row_name = rowname
self.col_name = colname
# self.setText(value)
self.__value = value
@property
def value(self):
return self.__value
@value.setter
def value(self, value):
if self.__value != value:
self.__value = value
# self.setText(value)
signal = self.tbl_name + ":" + self.row_name + ":" + self.col_name + ":" + self.text()
self.valueChanged.emit(signal)
然后在对话框中,将 SmartCell 引用导入为 sCell 后:
item = sCell(obj_name, f.part_name, "start_frame", str(f.start_frame))
item.valueChanged.connect(self.frame_cell_changed)
tbl.setItem(rowcounter, 1, item)
item = sCell(obj_name, f.part_name, "end_frame", str(f.end_frame))
item.valueChanged.connect(self.frame_cell_changed)
tbl.setItem(rowcounter, 2, item)
【问题讨论】:
-
1) 你可以解释 QComboBox 的动态,2) 你说第一列从 a 到 b,比如说从 2 到 10,然后如果你放 5,那么第二列应该取值 6 到更大,假设取值 7,现在将第一个值更改为 8,那个 7 会发生什么:该值应该被删除还是保持或设置为 8?
-
3) 添加的表格有多少行?
-
假设 A 列的初始值为 0,B 列的初始值为 18。如果我尝试将 A 列中的值更改为 20(或任何大于 18 的值) 然后 A 列会将输入的值重置为 18。从 B 列的角度来看;如果 A 列的初始值为 20,B 列的初始值为 99。如果用户尝试将 B 列的值更改为 10,则验证会将值更改为 20,因为 B 列可能不小于 A 列。
-
3) 行号是可变的。它们基于从 Web API 返回的结果,具体取决于提供的 SKU。
-
好的,问题 2 和 3 已解决(对于我的示例,行数将是随机的),在问题 1 中,QComboBox 是否仅用于选择添加的 QTableWidgets 的数量?
标签: python python-2.7 pyqt pyqt4 qtablewidget