2011-06-15 10 views
9

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))); 
+0

¿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

+0

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

+0

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

Respuesta

5

Cuando esté cargando el ancho anterior de las columnas ocultas, el ancho que se salvó fue 0.
Por lo tanto, al cambiar el tamaño de la columna de asegurarse de que la anchura es mayor que 0.
hacer esto y entonces las columnas se mostrarán/ocultarán como se esperaba.

+0

Esto debería documentarse en la descripción de Qt 'QTableView :: hideColumn()'. – phyatt

Cuestiones relacionadas