2010-10-27 687 views
9

Tengo una tabla con 3000 filas y 8 columnas. Yo uso QTableView. para insertar elementos que hacen:QTableView es extremadamente lento (incluso para solo 3000 filas)

QStandardItem* vSItem = new QStandardItem(); 
vSItem->setText("Blabla"); 
mModel->setItem(row, column, vSItem); 

donde mmodel es QStandardItemModel. Todo está bien si no tengo muchas filas, pero cuando intento visualizar datos grandes (aproximadamente 3000 filas), entonces es extremadamente lento (20 segundos en Win 7 de 64 bits (máquina de 8 núcleos con 8 GB de ¡¡¡RAM!!!)). ¿Hay algo que pueda hacer para mejorar el rendimiento?

Gracias de antemano.

Respuesta

1

¿Tiene un autoresize en los contenidos para sus columnas o filas? ¡Puede ser un asesino en el rendimiento a veces!

un vistazo aquí: QHeaderView::ResizeToContents

espero que ayude!

+0

explícitamente. A menos que esto se haga de manera predeterminada, no lo tengo. – Tom

+0

Lo que tengo es: mUi.mImagesTableView-> setAlternatingRowColors (true); mUi.mImagesTableView-> setSelectionMode (QAbstractItemView :: SingleSelection); mUi.mImagesTableView-> setSelectionBehavior (QAbstractItemView :: SelectRows); mUi.mImagesTableView-> setEditTriggers (QAbstractItemView :: NoEditTriggers); mUi.mImagesTableView-> setIconSize (QSize (vIconSize, vIconSize)); mUi.mImagesTableView-> setColumnWidth (0, vIconPlusBorder); mUi.mImagesTableView-> horizontalHeader() -> setStretchLastSection (true); – Tom

+0

intente y deshabilite setStretchLastSection, deshabilite el cambio de tamaño automático (no recuerdo si se hace de forma predeterminada) ... En otras palabras, intente y deshabilite todo lo que pueda estar relacionado con el cambio de tamaño de filas y columnas ... En mi aplicación, en versión, tengo una vista en árbol (con columnas) con más de 10 mil elementos y puedo cambiar el tamaño de todo sin problemas ... Pero si enciendo esas características de cambio de tamaño automático, ¡mis impresiones se malogran! –

3

Encontré una solución: el problema era que asigné el modelo a la vista de tabla ya en el constructor. Así que cada vez que insertaba el artículo en el modelo, tableview era informado y probablemente actualizado. Ahora asigno el modelo a la vista de tabla solo después de llenar mi modelo con datos. Esta no es una solución elegante, pero funciona. ¿Hay alguna forma de desactivar temporalmente el modelo de tableview o algo que diga a la vista de tabla que no le importan los cambios en el modelo?

+1

Puede intentar jugar con blockSignals (http://doc.trolltech.com/main-snapshot/ qobject.html # blockSignals) en el modelo, pero eso probablemente le cause más dolores de cabeza. Realmente, debería considerar dejar la orden de la misma manera, o cambiar a su propio modelo (para que sepa cuándo decir que ha cambiado los datos). –

+2

Para grandes conjuntos de datos, consideraría escribir un modelo "apropiado" en lugar de usar QStandardItemModel. Allí puede insertar datos en fragmentos más grandes que los elementos individuales, cada uno disparando la vista para actualizar, lo que me debería mucho más rendimiento. Editar: Veo que acabo de repetir lo que James dijo a continuación ... –

2

Para esta cantidad de datos, sería mejor con un modelo personalizado; de este modo, usted tendría el control de cuándo informaría la vista de las actualizaciones, por ejemplo. Los ítems "estándar" se escalan a cientos, y probablemente a miles, debido a que el hardware moderno es rápido, pero están explícitamente documentados como no destinados a conjuntos de datos de este tamaño.

1

Además, si todas sus filas tienen la misma altura, establecer http://doc.qt.io/qt-5/qtreeview.html#uniformRowHeights-prop en true puede aumentar el rendimiento. En mi caso, un modelo que contenía aproximadamente 50.000 filas era casi inutilizable con uniformRowHeights establecido en falso (el valor predeterminado). Después de cambiarlo a verdadero, funcionó como un amuleto.

+5

Esta función es para QTreeView, aquí estamos hablando de QTableView –

+0

haciendo esto casi duplicó la velocidad! – Midhun

6

Buena llamada en el autoresize sobre los contenidos de sus columnas o filas.

Tengo una función que agrega una columna a la tabla cada vez que un cliente se conecta a mi aplicación de servidor. A medida que el número de columnas en la tabla aumentó, el tiempo de inserción pareció tomar más y más tiempo.

Estaba haciendo una ui-> messageLog-> resizeRowsToContents(); cada vez. Cambié esto para cambiar automáticamente el tamaño de la fila que se estaba agregando ui-> messageLog-> resizeRowToContents (0) ;, y la lentitud se fue.

0

Estoy usando 80000 filas y tuve un problema similar al agregar grandes cantidades de elementos a una tabla.

Mi solución fue dejar que asignara la memoria de manera avanzada diciéndole cuántas filas necesitaría.

que estaba usando un Qtableview y el modelo, así que:

self.model.setRowCount (80000)

Estoy seguro de que puede coincidir esto con su código

1

intente esto:

   QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE"); 

     void SELECT_TO_TBLWID(QTableWidget * TBL, QString DbPath,QString SQL) 
        { 
         QSqlDatabase db2 =QSqlDatabase::database(); 
         db2.setDatabaseName(DbPath); 
         if(!db2.open()) 
         { 
         qDebug() << db2.lastError(); 
         qFatal("Failed to connect."); 
         } 
         QSqlQuery qry; 
         qry.prepare(SQL); 
         if(!qry.exec()) 
          qDebug() << qry.lastError(); 
         else 
         { 
          QSqlRecord rec = qry.record(); 

          TBL->setColumnCount(rec.count()); 
          int RW=0; 
          for(int r=0; qry.next(); r++) 
           {RW++;} 
           TBL->setRowCount(RW); 
           for (int pr=RW;qry.previous();pr--){// do nothing} 

         for(int r=0; qry.next(); r++) 
          { 

           for(int c=0; c<rec.count(); c++) 
           { 
            if (r==0) 
            { 
             TBL->setHorizontalHeaderItem(c,new QTableWidgetItem(rec.fieldName(c))); 
            } 

           TBL->setItem(r, c, new QTableWidgetItem(qry.value(c).toString())); 

           } 

          } 
         } 

         db2.close(); 
       } 
No
+2

Aunque este código puede ayudar a resolver el problema, no explica _por qué_ y/o_how_ responde la pregunta. Proporcionar este contexto adicional mejoraría significativamente su valor a largo plazo. Por favor [edite] su respuesta para agregar una explicación, incluyendo qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas