2010-08-08 26 views
27

No estoy seguro de cómo preguntar esto, así que no dude en pedir más información.Cómo asegurarse de que las columnas en QTableView cambian de tamaño al máximo

Parece que tableView->resizeColumnsToContents() solo cambiará el tamaño de todas las columnas en función de los datos en la vista actual. Lo que significa que si tengo más datos a continuación (que es más largo en términos de recuentos de palabras), esas palabras se cerrarán (si la propiedad wordWrap está establecida en verdadero).

Lo extraño es que si me desplazo hacia abajo hasta la parte inferior y actualizo los datos, tableView cambiará el tamaño de esas columnas correctamente. Parece como si tableView no supiera que hay texto más largo a continuación.

Entonces, mi pregunta es, ¿cómo puedo asegurarme de que las columnas se redimensionan al máximo en función de todos los datos?

Mis códigos

QSqlTableModel *model = new QSqlTableModel; 
model->setTable("item"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
model->select();  
tableResult->setModel(model);  
tableResult->setEditTriggers(QAbstractItemView::NoEditTriggers);  
tableResult->setSelectionBehavior(QAbstractItemView::SelectRows); 
tableResult->setSelectionMode(QAbstractItemView::SingleSelection);  
tableResult->resizeColumnsToContents(); 
tableResult->resizeRowsToContents(); 

Actualizar 1

he intentado tableResult->scrollToBottom() y sólo cambiará de tamaño basada en los puntos en la parte inferior. Entonces, si hay palabras más largas en el medio, esas palabras se envolverán.

Actualización 2

Si alguien quiere entender lo que estoy hablando, simplemente download este ejemplo. Verá que al hacer clic en PushButton se generarán datos que no se redimensionarán correctamente.

Actualización 3

Posiblemente un error: https://bugreports.qt.io/browse/QTBUG-9352

+0

Estoy teniendo este problema también. solo las filas que son visibles cambian de tamaño. ¿Alguna vez has encontrado una solución para esto? – ComputerEngineer88

Respuesta

38

he conseguido encontrar una solución a este tema, sólo hay que ocultar la tabla de antes de llamar resizeColumnsToContents().

Por ejemplo:

tableResult->setVisible(false); 
tableResult->resizeColumnsToContents(); 
tableResult->setVisible(true); 
+1

+1 Beautifül!Nunca hubiera pensado en eso ... –

+1

Extrañamente, 'table.resizeColumnsToContents()' funciona sin ocultar/mostrar la tabla con PyQt5 – zdimension

+2

En Qt 5.6 también 'table.resizeColumnsToContents()' funciona sin ocultar/mostrar la tabla – Indraraj

5

Creo que es porque QSqlTableModel carga datos sobre la demanda y la opinión de los anchos de columna calcula basándose únicamente en los datos que están disponibles. Si no necesita sus columnas a ser de tamaño variable de usuario, puede intentar esto:

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); 
+0

No funciona. La columna aún no está redimensionando correctamente. Puse el código al final de la función. También probé QList como fuente de datos con QStandardItemModel como modelo. – amree

4

que utilizaron la misma solución como se describe por AMREE, que funcionó muy bien para los anchos de columna, pero tableView->resizeRowsToContents() no estaba funcionando correctamente si las columnas fuera de la pantalla tenían células de varias líneas que deben tener hizo que aumentara la altura de una fila.

Miré en la fuente de Qt y parece que algunos de los cálculos dependen de la geometría de la ventana gráfica. Esto parece hacer que todo funcione correctamente para columnas y filas:

#include <limits> 

tableView->setVisible(false); 
QRect vporig = tableView->viewport()->geometry(); 
QRect vpnew = vporig; 
vpnew.setWidth(std::numeric_limits<int>::max()); 
tableView->viewport()->setGeometry(vpnew); 
tableView->resizeColumnsToContents(); 
tableView->resizeRowsToContents(); 
tableView->viewport()->setGeometry(vporig); 
tableView.setVisible(true); 
+2

La respuesta de amree me ayudó, pero me encontré con un problema al calcular automáticamente el tamaño de las filas al mismo tiempo y pensé que sería útil para los futuros lectores publicar mi solución a ese problema estrechamente relacionado. Un poco más que "esencialmente nada", diría yo. – dougg3

+0

¡Excelente, he estado tratando de resolver ese problema por tanto tiempo! –

Cuestiones relacionadas