2015-07-23 24 views
6

Ho un programma che carica un profilo da un file csv e visualizza i dati in una tabella. Il caricamento di un frame di dati panda sulla tabella è veloce perché ho utilizzato un'implementazione del modello personalizzato di QAbstractTableModel, ma il ridimensionamento del widget QTableView è incredibilmente lento.PyQt QTableView rallenta in modo proibitivo quando si scorre con set di dati di grandi dimensioni

Cosa posso fare per rendere più fluido il ridimensionamento e lo scorrimento?

+0

mostrare ciò che si è tentato !!! non possiamo indovinare il problema – Ja8zyjits

+2

Non è chiaro? Carico 10k linee in una tabella e lo scorrimento richiede per sempre, quale codice ti serve, il codice per impostare un modello su una tabella? In altri linguaggi ci sono abilitazioni per il controllo del rendering, ma non ho idea di come farlo nell'ambiente QT. –

+0

Domanda simile in C++: [QTableView prestazioni lente con 1000s di celle visibili] (http://stackoverflow.com/questions/19691577/qtableview-slow-performance-with-1000s-of-visible-cells) – Mel

risposta

7

Bene, ho finito per modificare il modello di tabella personalizzato che ho creato per usare numpy, e ora è molto veloce.

Utilizzare questo modello da tavolo:

import numpy as np 

class PandasModel(QtCore.QAbstractTableModel): 
    """ 
    Class to populate a table view with a pandas dataframe 
    """ 
    def __init__(self, data, parent=None): 
     QtCore.QAbstractTableModel.__init__(self, parent) 
     self._data = np.array(data.values) 
     self._cols = data.columns 
     self.r, self.c = np.shape(self._data) 

    def rowCount(self, parent=None): 
     return self.r 

    def columnCount(self, parent=None): 
     return self.c 

    def data(self, index, role=QtCore.Qt.DisplayRole): 
     if index.isValid(): 
      if role == QtCore.Qt.DisplayRole: 
       return self._data[index.row(),index.column()] 
     return None 


    def headerData(self, p_int, orientation, role): 
     if role == QtCore.Qt.DisplayRole: 
      if orientation == QtCore.Qt.Horizontal: 
       return self._cols[p_int] 
      elif orientation == QtCore.Qt.Vertical: 
       return p_int 
     return None 
+1

'return self._data [index.row(), index.column()]' non ha funzionato affatto per me. Da [scipy.org] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.item.html) a.item (* args) è molto simile a un [args], tranne , invece di un array scalare, viene restituito uno scalare standard di Python. Questo può essere utile per accelerare l'accesso agli elementi dell'array e fare aritmetica sugli elementi dell'array usando la matematica ottimizzata di Python. Quindi ho usato 'row_column = tuple ([index.row(), index.column()])' 'return self._data.item (row_column)' – Zak