【问题标题】:Can't select entire row of data from QTableWidget无法从 QTableWidget 中选择整行数据
【发布时间】:2018-01-16 14:26:24
【问题描述】:

问题陈述

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

背景

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

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

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

问题

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

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

我尝试的第二种方法是迭代给定的行列,以便通过附加项目值来逐个填充列表。但是,当我这样做时,它只会重复用相同的数字填充列表,这是我 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。请询问是否需要更深入的解释。

【问题讨论】:

  • 哦不,我没看到谢谢!我

标签: python pyqt pyqt5 qtableview qtablewidget


【解决方案1】:

根据documentation

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

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

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

您必须使用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' 对象不可调用

【讨论】:

  • 哇,谢谢,我永远不会明白这一点!我会记住我的命名约定与内置函数可能存在的冲突。当我在启动 multiplot 中更改 itemAt(i,j) 时,其他一切正常!
  • ItemAt(x, y)根据其几何位置返回widget,因此对于x的小值,它总是返回相同的QTableWidgetItem,因此返回相同的文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多