2017-08-08 5 views
0

Problème DéclarationImpossible de sélectionner toute la ligne de données à partir QTableWidget

Je suis en train de sélectionner des lignes de données de mon QTableWidget et les imprimer à ma console juste pour que je puisse tester certaines choses, avec le objectif final étant capable de tracer les données. Cependant, je ne peux jamais saisir toute la ligne de données.

Contexte

J'ai fait une interface graphique qui peut intégrer plusieurs QTableWidgets par l'importation d'un fichier CSV spécifiquement formaté. L'objectif est de pouvoir extraire des données de plusieurs lignes à partir de tables identiques ou différentes, puis de les tracer côte à côte. Où chaque rangée de données sera son propre ensemble de données et aura sa propre intrigue, mais il y aura plusieurs parcelles sur le même chiffre.

Pour compléter cette tâche j'ai créé une fenêtre appelée CompareWindow qui s'ouvre quand un bouton Qpush appelé "Compare" est pressé. La fenêtre invite l'utilisateur à entrer les noms des tables et les lignes correspondantes de la table à tracer. Après que cette information a été soumise j'ai un dictionnaire que je peux référencer qui a sauvé tous les QTableObjects qui ont été instanciés. Où les clés sont les noms donnés aux tables qui sont connectés à leur objet Table correspondant.

Problème

Les deux principales méthodes que j'ai essayé de saisir les données de ligne sont ...

La première idée utilisait commande TableObject.selectRow() J'itérer les lignes que je voulais, mais chaque fois que je l'ai fait cela retournerait un non-type.

La seconde méthode que j'ai essayée consistait à itérer une colonne de lignes donnée afin qu'elle remplisse une liste une par une en ajoutant les valeurs d'item. Cependant, quand je l'ai fait, il n'a rempli la liste avec le même nombre à plusieurs reprises, ce qui était la première cellule de mon Qtable.

Même lorsque j'appelais explicitement une certaine ligne ou colonne, j'obtiendrais la même sortie. La sortie tirée est .12, le nombre de la première cellule dans mon fichier CSV.

Voici le code en question avec lequel j'ai des problèmes.

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) 

Voici mon lien GitHub contenant tous mes fichiers: https://github.com/Silvuurleaf/Data-Visualize-Project

Le problème se produit dans mon fichier Perspective.py dans la méthode initiateMultiPlot. Le fichier CompareWindow.py envoie un signal à mon Perspective.py et est connecté à initateMultiPlot. S'il vous plaît se renseigner si quelque chose nécessite une explication plus en profondeur.

+0

Oh non je n'ai pas vu merci! Je –

Répondre

1

Selon le documentation:

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

Returns the item at the position equivalent to QPoint(ax, ay) in the table widget's coordinate system, or returns 0 if the specified point is not covered by an item in the table widget.

C'est, renvoie le x élément donné et y qui sont coordonnées graphiques par rapport à QTableWidget, et est clairement pas ce que vous recherchez.

Vous devez utiliser le item():

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

Returns the item for the given row and column if one has been set; otherwise returns 0.

Mais dans votre cas ne fonctionnera pas à moins que vous ne le changement suivant:

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) 

C'est, vous changez votre self.item en item.

Le problème est que, à première vue l'erreur est assez difficile, la classe QTableWidget a une fonction item(), mais lorsque vous utilisez l'instruction self.item vous remplacez cet appel, à savoir quand python lit cette déclaration, il utilisera l'attribut et pas la fonction, donc vous obtenez l'erreur:

TypeError 'xxx' object is not callable

+0

Wow merci je n'aurais jamais attrapé ça! Je garderai à l'esprit les conflits que mes conventions de nommage peuvent avoir avec les fonctions intégrées. Quand j'ai changé mon itemAt (i, j) dans mon initié multiplot tout le reste a fonctionné! –

+0

'ItemAt (x, y)' renvoie le widget en fonction de sa position géométrique, donc pour les petites valeurs de x, et renvoie toujours le même QTableWidgetItem, et donc le même texte. – eyllanesc

+0

hmmm je vois merci pour la clarification! –