Ver Mensaje Individual
  #6 (permalink)  
Antiguo 07/03/2014, 02:52
edanvar
 
Fecha de Ingreso: octubre-2013
Mensajes: 59
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Pasar una PyTable muy grande a un QTableWidget

Lo he hecho, utilizando el evento generado al hacer scroll.

Todo funciona, pero no tan bien como yo quisiera....pongo el codigo y luego explico por que no va bien, a ver si alguien puede sugerir algo:

Código Python:
Ver original
  1. #La primera vez que muestro la tabla, solo
  2. #muestro unas pocas lineas de la PyTable,
  3. #las necesarias para llenar la pantalla
  4. for x in tab.iterrows(start=0, stop=35):
  5.     res.append(x[:])
  6.  
  7. for i, row in enumerate(res):
  8.      #aqui almaceno el indice de linea, para usarlo luego
  9.      self.indexi = i
  10.      for j, col in enumerate(row):
  11.         #Y aqui relleno la QTableWidget
  12.          item = QTableWidgetItem(str(col))
  13.          self.ui.tableWidget.setItem(i, j, item)

Previamente a todo esto ya habia hecho la conexion del evento de scroll asi:

Código Python:
Ver original
  1. QtCore.QObject.connect(self.ui.tableWidget.verticalScrollBar(), QtCore.SIGNAL('valueChanged(int)'), self.updateTable)

Y el slot que responde al evento, es mas o menos como lo anterior:

Código Python:
Ver original
  1. @QtCore.pyqtSlot(int)
  2. def updateTable(self, number):
  3.     res = []
  4.     for x in self.node.iterrows(start=self.indexi+1, stop=self.indexi+number):
  5.         res.append(x[:])
  6.     for i, row in enumerate(res):
  7.             self.indexi = self.indexi + 1
  8.             for j, col in enumerate(row):
  9.                 item = QTableWidgetItem(str(col))
  10.                 self.ui.tableWidget.setItem(self.indexi, j, item)  
  11.                 QApplication.instance().processEvents()

Ahora, EL PROBLEMA: todo esto funciona bien, el slot responde y todo eso, PERO, la PyTable es muy grande, mas de 1millon de lineas, y al hacer scroll en la QTableWidget, como ya habia definido previamente sus atributos, lo que sucede es que al hacer scroll en la QTableWidget, el scroll es un avance de mas de 5000 lineas, con lo cual al intentar actualizar la QTableWidget con 5000 o mas lineas de golpe, no responde instantaneo, le cuesta varios segundos.

Código Python:
Ver original
  1. self.ui.tableWidget.setRowCount(tab.nrows)
  2. self.ui.tableWidget.setColumnCount(len(tab.colnames))

P.D: tampoco responde bien si haces varios scrolls seguidos, rapidos en la QTableWidget

Última edición por edanvar; 07/03/2014 a las 07:32