example qt qtableview
download

example - qtablewidget pyqt



Cómo asegurarse de que las columnas en QTableView se cambien al máximo (3)

No estoy seguro de cómo preguntar esto, así que siéntase libre de pedir más información.

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 wordWrap (si la propiedad de wordWrap se establece en verdadero).

Lo extraño es que si me desplazo hacia abajo 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 esas 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();

Actualización 1

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

Actualización 2

Si alguien quisiera entender de lo que estoy hablando, solo 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


Creo que eso se debe a que QSqlTableModel carga datos bajo demanda y la vista calcula el ancho de las columnas basándose solo en los datos disponibles. Si no necesita que sus columnas sean redimensionables por el usuario, puede intentar esto:

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


Me las arreglé para encontrar una solución para este problema, solo necesita ocultar la tabla antes de llamar a resizeColumnsToContents() .

Para un ejemplo:

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


Utilicé la misma solución descrita por amree, que funcionó muy bien para los anchos de columna, pero tableView->resizeRowsToContents() no funcionaba correctamente si las columnas fuera de pantalla tenían celdas de tableView->resizeRowsToContents() que deberían haber causado 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);