2010-04-04 13 views

Respuesta

77

Insertar en el QTableWidget siguientes tipos de artículos:

QTableWidgetItem *item = new QTableWidgetItem(); 
item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); 

funciona bien!

EDIT:

QTableWidgetItem *item = new QTableWidgetItem(); 
item->setFlags(item->flags()^Qt::ItemIsEditable); 

Ésta es una solución mejor. Gracias a @priomsrb.

+14

Sería mejor usar 'item-> setFlags (item-> flags()^Qt :: ItemIsEditable);'. Esto dejará las otras marcas intactas – priomsrb

+1

@priomsrb ¿Por qué usas un exclusivo o (XOR) en lugar de 'item-> flags() & ~ Qt :: ItemIsEditable' como lo sugiere el usuario2923436? El resultado de XOR depende del estado predeterminado de los indicadores. – m7913d

+0

@ m7913d Creo que tienes razón. Mi solución solo alterna el estado editable. Por lo tanto, no funcionaría si el elemento ya era solo de lectura. – priomsrb

27

El resultado del uso de XOR depende de cuál es el estado actual. Sugeriría usar

item->setFlags(item->flags() & ~Qt::ItemIsEditable); 

para asegurarse de que la edición esté desactivada independientemente de la configuración actual.

+0

Intenté esta solución tuya y no funcionó: el compilador se quejó del '~'. – Momergil

0

Para aplicar el código de @ Narek a filas o columnas, simplemente use un bucle for simple y ponga una condición para incluir los indicadores para filas/columnas que no desea que sean editables.

El siguiente código lee un archivo CSV en un QTableWidget:

if(!rowOfData.isEmpty()){ 
for (int x = 0; x < rowOfData.size(); x++) 
    { 
     rowData = rowOfData.at(x).split(","); 
     if(ui->table_Data->rowCount() <= x) ui->table_Data->insertRow(x); 
     for (int y = 0; y < rowData.size(); y++) 
     { 
      QTableWidgetItem *item = new QTableWidgetItem(rowData[y],QTableWidgetItem::Type); 
      if(y < 3) item->setFlags(item->flags()^Qt::ItemIsEditable); // Only disables the first three columns for editing, but allows the rest of the columns to be edited 
      ui->table_Data->setItem(x,y,item); 
      ui->table_Data->repaint(); 
     } 
    } 
} 
0

llegué a una sugerencia mejor, simplemente sobrescribir la señal cellDoubleClicked con una nueva ranura. Esto es, si desea que ninguna de las celdas sea modificada

+0

No hay necesidad de hacer eso, es por eso que tenemos banderas de artículos. Solo una línea para arreglar su problema. – reggie

+0

¿La diferencia es que debería excluir el indicador del mapa de bits en todos sus elementos secundarios? Mi sugerencia era excluir la escritura de 20 líneas con & ~ bitmap flag si desea que todo el widget sea de solo lectura. En realidad, mi comentario fue incorrecto de todos modos, debería decir desconectar la señal de cellDoubleClicked – Damdidam

Cuestiones relacionadas