Pregunta

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.

Entonces, tengo un QTableView Eso tiene columnas que se pueden mostrar/ocultar como le gusta al usuario. Después de inicializar la tabla, llamo a un personalizado restoreColumns() método que oculta las columnas (usando QTableView::hideColumn()) que el usuario había ocultado la última vez que la GUI estaba abierta.

El problema se produce cuando el usuario intenta mostrar las columnas que estaban ocultas por el usuario la última vez que se ejecutó la GUI. La señal/ranura apropiada se llama y se ejecuta, pero por alguna razón el QTableView no se actualiza para mostrar la columna.

Lo extraño es que cualquier columna que ya se muestre (no estaba oculta por el usuario la última vez que se ejecutó la GUI) no tiene problemas para ocultar/mostrar.

¿Alguna idea? ¡Gracias!


Así es como inicializo la mesa ...

m_tableModel = new mytablemodel();
m_tableView = new mytableview();
m_tableView->setItemDelegate(m_tableDelegate);
m_tableView->setModel(m_tableModel);

Método Meat of Restorecolumns ():

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 algún código de muestra 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 el menú contextual del QHeaderView del QTableView.

connect(action, SIGNAL(toggled(bool)), this, SLOT(showAColumn(bool)));  
¿Fue útil?

Solución

Cuando está cargando el ancho anterior de las columnas ocultas, el ancho que se guardó era 0.
Entonces, al cambiar el tamaño de la columna, asegúrese de que el ancho sea mayor que 0.
Haga esto y luego las columnas se mostrarán/se esconderán como se esperaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top