Estoy tratando de hacer algo que parece que debería ser muy simple, pero cuanto más lo miro me pregunto si es un error Qt.Mostrando una columna QTableView oculta
Por lo tanto, tengo un QTableView
que tiene columnas que se pueden mostrar/ocultar como el usuario le gusta. Después de inicializar la tabla, llamo a un método personalizado restoreColumns()
que oculta las columnas (usando QTableView::hideColumn()
) que el usuario había ocultado la última vez que se abrió la GUI.
El problema se produce cuando el usuario intenta mostrar las columnas que el usuario había ocultado la última vez que se ejecutó la GUI. Se llama y se ejecuta la señal/ranura apropiada, pero por algún motivo el QTableView
no se está actualizando para mostrar la columna.
Lo raro es que cualquier columna que ya se muestra (no fue ocultada por el usuario la última vez que se ejecutó la GUI) no tiene problemas para ocultarse/mostrarse.
¿Alguna idea? ¡Gracias!
Así es como me inicializar la tabla ...
m_tableModel = new mytablemodel();
m_tableView = new mytableview();
m_tableView->setItemDelegate(m_tableDelegate);
m_tableView->setModel(m_tableModel);
Carne de restoreColumns() Método:
for (int i=0; i<horizontalHeader()->count(); i++) {
// load size to restore previous width
...
horizontalHeader()->resizeSection(i, width); // restore width
// load previous column position
...
// restore column order
int currentVisualIndex = horizontalHeader()->visualIndex(i);
if (currentVisualIndex != visualIndex)
horizontalHeader()->moveSection(currentVisualIndex, visualIndex);
// load previous hidden/shown state
...
if (columnHidden) {
hideColumn(i);
} else {
showColumn(i);
}
}
A continuación se muestra un código de ejemplo para mostrar/ocultar una de las columnas .
void mytableview::showAColumn(bool checked) {
// mytableview is a subclass of qtableview
if (checked)
showColumn(COLUMN_A); // COLUMN_A is an enum for the column
else
hideColumn(COLUMN_A);
}
que está conectado a un QAction
que se puede acceder desde el menú y menú contextual de la QHeaderView
del QTableView
.
connect(action, SIGNAL(toggled(bool)), this, SLOT(showAColumn(bool)));
¿Podría intentar agregar una llamada ['resizeColumnToContents'] (http://doc.qt.nokia.com/latest/qtableview.html#resizeColumnToContents) después de' showColumn() '? (Estoy pensando que el 'hide' pasa demasiado temprano, la columna puede tener un tamaño no válido) – Mat
Lo intenté - sin cambios. Creo que tiene algo que ver con cómo aparece hideColumn antes de que la vista de tabla esté pintada en la pantalla ... no estoy seguro de cómo llamar a mi método restoreColumns() una vez que se ha dibujado la tabla. – Daren
Acabo de agregar algunos detalles más al método restoreColumns(). Parece que el material en el que estoy redimensionando la columna es donde se arruina. Cuando comencé a comentar esa sección, funcionó como se esperaba. Sin embargo, luego perdí la capacidad de restaurar el ancho de columna anterior ... – Daren