繁体   English   中英

无法从 QTableWidget 中选择整行数据

[英]Can't select entire row of data from QTableWidget

问题陈述

我试图从我的 QtableWidget 中选择数据行并将它们打印到我的控制台,这样我就可以测试一些东西,最终目标是能够绘制数据。 但是我永远无法获取整行数据。

背景

我制作了一个 GUI,可以通过导入特定格式的 CSV 文件来嵌入多个 QTableWidget。 目标是能够从相同或不同表的多行中提取数据,然后以并排方式绘制它们。 每一行数据都是它自己的数据集并有自己的图,但在同一个图上会有多个图。

为了完成这项任务,我制作了一个名为 CompareWindow 的窗口,当按下名为“Compare”的 Qpushbutton 时,该窗口会打开。 该窗口提示用户输入表格的名称以及他们希望绘制的表格中的相应行。

提交此信息后,我有可以参考的字典,其中保存了所有已实例化的 QTableObject。 其中键是给连接到它们相应的表对象的表的名称。

问题

我尝试获取行数据的两种主要方法是……

第一个想法是使用 TableObject.selectRow() 命令,我会遍历我想要的行,但是每当我这样做时,它都会返回一个 nonetype。

我尝试的第二种方法是迭代给定的行列,以便通过附加项目值来一个一个地填充列表。 但是,当我这样做时,它只会重复使用相同的数字填充列表,这是我 Qtable 中的第一个单元格。

即使我明确调用某个行或列,我也会得到相同的输出。 被拉出的输出是 .12,这是我的 CSV 文件中第一个单元格的数字。

这是我遇到问题的相关代码。

    def initiateMultiPlot(self, tableV, rowV, PlotV):
    """
        1. Match TableName values with the key values in our TableDB
        2. When we find a  match look at that key's corresponding Table Object, and iterate
        through that objects rows and select the rows specified by rowV
        3.Call plot for those values

    """

    #calls my class and creates a blank figure where eventually we will plot data on
    f = CreateFigure.FigureAssembly()
    print("")
    for i in tableV:
        """
            tableV: is list of strings that represent assigned tablenames [Table1, Table2, Table3]
            rowV: is a list, containing lists representing rows from corresponding Tables the user wishes to plot.
                for example [[1,2],[3,4],[1]] means rows 1,2 from table1, rows 3,4 from table2... so on
            PlotV: is a string that is ethier "box" or "whisker" to tell what method to plot. Default right now 
            is to do a simple boxplot
        """
        print("Creating table instance")

        #Table Dictionary is setup so the names of the Tables (tableV) are the keys of the dictionary
        #and the actual table objects are referenced by these keys
        self.TableOBJ = self.TableDictionary[i]
        print("Data Type for the table object is..................{}".format(type(self.TableOBJ)))

        #empty list that will store our row data
        self.Elements = []
        try:
            for rows in rowV:

                for i in rows:
                    print("rowV value is... {}".format(rowV))
                    print("current row list{}".format(rows))
                    print("i value is {}".format(i))
                    print("itterating")

                    for j in range(self.TableOBJ.columnCount()):
                        print("i value is ...{}".format(i))
                        print("j value is .... {}".format(j))

                        #FIRST idea try selecting entire row of data
                        print("i value is ...{}".format(i))
                        print("j value is .... {}".format(j))

                        #entire row returns none-type
                        EntireRow = self.TableOBJ.selectRow(i)
                        print(EntireRow)

                        #selecteditems

                        #SECOND idea try using for loop and iterating through every value in a row
                        item = self.TableOBJ.itemAt(i,j)

                        #explicit call for (row 1, col 1) and  (row 3, col 3), both which output .12
                        print(self.TableOBJ.itemAt(1,1).text())
                        print(self.TableOBJ.itemAt(3,3).text())
                        print("printing item...... {}".format(item))
                        element = item.text()
                        print(element)

                        #list of .12
                        self.Elements.append(element)

                    #elements = [self.TableOBJ.item(i, j).text() for j in range(self.TableOBJ.columnCount()) if
                    #            self.TableOBJ.item(i, j).text() != ""]
                    #print(elements)

        except Exception as e:
            print(e)

        print(self.Elements)

这是包含我所有文件的 GitHub 链接: https : //github.com/Silvuurleaf/Data-Visualize-Project

问题发生在我的文件 Perspective.py 中的方法initialMultiPlot 中。 文件 CompareWindow.py 向我的 Perspective.py 发送一个信号并连接到 initateMultiPlot。 请询问是否需要更深入的解释。

根据文档

QTableWidgetItem *QTableWidget::itemAt(int ax, int ay) const

返回表小部件坐标系中与 QPoint(ax, ay) 等效的位置处的项目,如果指定点未被表小部件中的项目覆盖,则返回 0。

也就是说,返回给定的项 x 和 y,它们是相对于QTableWidget图形坐标,显然不是您要查找的。

您必须使用item()

QTableWidgetItem *QTableWidget::item(int row, int column) const

如果已设置,则返回给定行和列的项目; 否则返回 0。

但在您的情况下将不起作用,除非您进行以下更改:

class CreateTable(QTableWidget):
     ....
            for j in range(0, m):
                self.item = QTableWidgetItem(str(round(ValList[j], 6)))
                # print("{}, {}".format(i, j))
                self.setItem(i, j, self.item)

到:

class CreateTable(QTableWidget):
     ....
            for j in range(0, m):
                item = QTableWidgetItem(str(round(ValList[j], 6)))
                # print("{}, {}".format(i, j))
                self.setItem(i, j, item)

也就是说,您将self.item更改为item

问题是乍一看这个错误相当困难,QTableWidget 类有一个item()函数,但是当您使用self.item语句时,您正在替换该调用,即当 python 读取该语句时,它将使用该属性和不是函数,所以你得到错误:

TypeError 'xxx' 对象不可调用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM