从TableWidget中选定的单元格中检索单元格数据

7
我正在制作一个库存控制程序,并遇到了获取所选单元格值的问题。我知道需要使用"QtGui.QTableWidget.currentRow"和"QtGui.QTableWidget.currentColumn"来获取项目的位置。但是因为在调用这些函数时并未选择任何内容,所以它返回-1,-1,我无法似乎让它起作用。
有谁知道如何使其在用户选择单元格时每次运行"QtGui.QTableWidget.currentRow"和"QtGui.QTableWidget.currentColumn"?
我认为一旦我获得了坐标,需要使用如下代码来获取实际数据:QtGui.QTableWidget.item。
以下是我用于获取行和列的代码:
row = self.table.currentRow
column = self.table.currentColumn
self.ID = self.table.item(row, column)

当用户点击添加库存按钮时,程序应该使用刚刚获取的产品代码来改变数据库,并在从用户处获得添加的数量后进行操作。我正在使用Python 3.2和PyQt 4。感谢任何帮助。谢谢Sam。

如果你能够发布一段代码片段,这可能会帮助我们理解,并且也能帮助你解释。 - danodonovan
更新: 我现在能够检索单元格项目,但它返回的是实际项目而不是数据。def getCell(self): row = self.table.currentRow() print(row)self.ID = self.table.item(row, 0) print(self.ID)这将返回<PyQt4.QtGui.QTableWidgetItem object at 0x0000000006509488>而不是“14”。有人可以帮忙吗? - Sam McKay
看一下我的更新答案 :-) 你想要在返回的项目上调用 item.text() - danodonovan
2个回答

24

QTableWidget 发现有人点击了它的某个单元格时,它将发出一个 cellClicked 事件 - 您需要连接到该事件。也许可以这样:

QTableWidget 看到有人点击其中一个单元格时,它会触发一个 cellClicked 事件,您需要对其进行连接。可能是这样的:

self.table.cellClicked.connect(self.cell_was_clicked)

这可能在您的设置代码中,而函数cell_was_clicked可能是类似于以下内容:

def cell_was_clicked(self, row, column):
    print("Row %d and Column %d was clicked" % (row, column))
    item = self.table.itemAt(row, column)
    self.ID = item.text()

我没有使用currentRowcurrentColumn因为您想要在click事件中得到响应。这个函数在这里有文档记录(抱歉,我更喜欢pyside - 它几乎与PyQT一样)。还要注意使用itemAt而不仅是item - 因为你会得到单元格中的项,而不是它的内容。使用QTableWidgetItem.text()函数来获取内容。

请注意 - 这里使用的是“插槽和信号”,特别是“新风格”。由于您正在使用PyQT4和Python 3,所以不会遇到“新东西”的任何麻烦:-)

您可以考虑浏览一个插槽和信号的教程 - 这可能会让一些抽象概念变得更清晰。祝好运!


行 = self.table.currentRow() print(行)self.item = self.table.item.text(行, 0) self.ID = self.item.text() print(self.ID)这个对我来说不起作用? 我得到了这个错误回溯(Traceback): File "F:\College\Computing\Stock control\Coding\Stock Control GUI.py", line 453, in getCell self.item = self.table.item.text(row, 0) AttributeError: 'builtin_function_or_method' object has no attribute 'text' - Sam McKay
看起来item不是一个QTableWidgetItem - 请查看 print(type(self.item)) 的输出结果,然后在手册中查找。 - danodonovan
啊,我刚刚注意到我的代码有一个小错误,我一直使用了item而不是使用itemAt。现在它完美地工作了,我可以继续完成这个程序 :L - Sam McKay
我想知道是否可以得到更多的帮助,如何将这个 [('example data', 'example data', 'example data', 'example data')] 转换为 [(example data),(example data),(example data),(example data)] ?? - Sam McKay
你可能应该开一个新的问题... 如果 example data 是一个数值,那么如果 x = [('example data', 'example data', 'example data', 'example data')],那么 [float(e) for e in x[0]] 将返回一个浮点数列表 - 由于你有一个嵌套列表,所以需要使用 x[0] - danodonovan
好的,没问题,我会继续尝试,如果没有进展,可能会开一个新的问题。 - Sam McKay

1

here is the code that worked for me:

def get_selected_cell_value():
    current_row = self.sold_items_details_table.currentRow()
    current_column = self.sold_items_details_table.currentColumn()
    cell_value = table.item(current_row, current_column).text()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接