2011-10-31 6 views
6

he un QTableWidget que poblar como esto:Strange QTableWidget - no todas las células pobladas después de la clasificación seguido por repoblar

// Clear the table 
    this->topPatchesTableWidget->setRowCount(0); 

    this->topPatchesTableWidget->setRowCount(numberToDisplay); 
    for(unsigned int pairId = 0; pairId < numberToDisplay; ++pairId) 
    { 
    // Display patch match scores 
    QTableWidgetItem* myLabel = new QTableWidgetItem; 
    myLabel->setData(Qt::DisplayRole, myValues[pairId]); 
    this->tableWidget->setItem(pairId, 0, myLabel); 
    ... fill other columns ... 
    } 

(Tengo algunos otros elementos de interfaz de usuario para establecer las propiedades que calculan los valores en myValues) . Si cambio las propiedades, recalculo y vuelvo a crear la tabla, todo funciona como se espera. Si clasifico la tabla haciendo clic en uno de los encabezados, ordena correctamente. SIN EMBARGO, si en este momento (después de la clasificación) hago clic en mi botón nuevamente para volver a calcular los valores y recrear la tabla, la tabla está muy rota. Es decir, muchas de las celdas están vacías y las celdas que no están vacías no parecen estar en un orden particular.

Mediante la adición de una llamada manual para

this->tableWidget->sortByColumn(0, Qt::AscendingOrder); 

al comienzo de mi función CreateTable, todo funciona como se esperaba, pero por supuesto la tabla recién creada se ordena por la columna 0 en lugar de la columna que se seleccionó para el último tipo.

¿Alguien tiene alguna idea de por qué las cosas irían tan mal sin la llamada a sortByColumn? (Traté de hacer un ejemplo simple pero no puedo replicar el problema en un programa de demostración).

Gracias,

David

Respuesta

12

Tuve un problema similar en python, si se seleccionó un encabezado de columna para habilitar la ordenación de las celdas después de que esa columna se detuviera.

Lo solucioné estableciendo self.tableWidget.setSortingEnabled (False) al principio del método add de fila, luego configurándolo de nuevo en self.tableWidget.setSortingEnabled (True) al final del método add de fila. De acuerdo con riverbank computing, esta es la forma oficialmente recomendada para abordar este problema.

QTableWidget.setItem(auto, int fila, int columna, artículo QTableWidgetItem)

Tenga en cuenta que si se habilita la ordenación (ver sortingEnabled) y la columna es la columna de ordenación actual , la fila se moverá a la posición ordenada determinada por el artículo.

Si desea establecer varios elementos de una fila en particular (por ejemplo, llamando a setItem() en un bucle), es posible que desee desactivar la ordenación antes de hacerlo, y luego volver a encenderla; esto le permitirá usar el mismo argumento de fila para todos los elementos en la misma fila (es decir, setItem() no moverá la fila).

Véase también el artículo() y takeItem().

+0

Éste funcionó y creo que debería ser la respuesta a esta pregunta. Probado en QTableWidget usando PyQt4. – ray

0

Nunca supe lo que estaba mal con esto. Me di por vencido e implementé un modelo/vista personalizado que de todos modos es una idea mucho mejor.

+1

Karnisov brindó una mejor respuesta a esta pregunta. Creo que deberías volver y seleccionar la suya como la solución. – ray

1

que tenían el mismo problema - siempre, cuando quería insertar nuevos datos, i buildet la cabecera y setSortingEnabled(true). Supongo que al QTableWidget no le gustan varias llamadas para setSortingEnabled(true). Así que lo puse en el constructor de MainWindown, ¡y eso es todo!

0

Esto es una elaboración de la respuesta de Karnisov, también con PyQt. Desactivación de la clasificación antes de hacer cualquier setItem() s también trabajaron para mí, pero es causado ordenación por selección del usuario que se pierde, así que lo hice como este, donde t es una QTableWidget:

oldSort = t.horizontalHeader().sortIndicatorSection() 
oldOrder = t.horizontalHeader().sortIndicatorOrder() 
t.setSortingEnabled(False) 

# make the changes 

t.sortItems(oldSort, oldOrder) 
t.setSortingEnabled(True) 

Tenga en cuenta que todavía es posible para el tipo de cambio ligeramente con este código. Esto parece ser debido a que el tipo que está utilizando Qt aquí no se mueve todos los elementos que ya estaban en orden, por lo que si teníamos una tabla como la siguiente:

NUMBER LETTER OTHER LETTER 
    1   B    C 
    2   G    Q 
    3   A    Q 

Si ordenar por número, y luego por otra letra , nada cambia. Pero si ordenar por carta y luego por otra letra, obtenemos:

NUMBER LETTER OTHER LETTER 
    1   B    C 
    3   A    Q 
    2   G    Q 

Así que si hubiéramos ordenados previamente por carta y luego otra letra, este código sólo lo hacen una sola especie por otra letra, y nosotros d termina con la segunda versión de la tabla en lugar de la primera (suponiendo que el orden en que se agregaron los elementos a la tabla coincida con NÚMERO). En este punto de mi código, todos los elementos se eliminan y se vuelven a agregar para actualizar la tabla, por lo que a veces esto puede ocasionar cambios notables en el orden.

Cuestiones relacionadas