69 votes

Comment rendre une colonne dans QTableWidget en lecture seule ?

Je voudrais avoir une colonne dans QTableWidget PAS modifiable.
Dans les forums, j'ai lu beaucoup de choses sur certains flags mais n'a pas réussi à les mettre en œuvre.

100voto

Narek Points 7815

Insérer dans le QTableWidget les éléments suivants :

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

Cela fonctionne bien !

EDITAR:

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

C'est une meilleure solution. Merci à @priomsrb.

21 votes

Il serait préférable d'utiliser item->setFlags(item->flags() ^ Qt::ItemIsEditable); . Cela laissera les autres drapeaux intacts

5 votes

@priomsrb Pourquoi utilisez-vous un ou exclusif (XOR) au lieu de item->flags() & ~Qt::ItemIsEditable comme suggéré par l'utilisateur2923436 ? Le résultat du XOR dépend de l'état par défaut des drapeaux.

0 votes

@m7913d Je pense que vous avez raison. Ma solution ne fait que basculer l'état modifiable. Elle ne fonctionnerait donc pas si l'élément était déjà en lecture seule.

50voto

user2923436 Points 41

Le résultat de l'utilisation de XOR dépend de l'état actuel. Je suggère d'utiliser

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

pour s'assurer que l'édition est désactivée, quel que soit le paramètre actuel.

0 votes

J'ai essayé votre solution et cela n'a pas fonctionné : le compilateur s'est plaint du '~'.

3 votes

~ est une négation par bit et devrait être supportée par tous les compilateurs.

2voto

Damdidam Points 1

J'ai trouvé une meilleure suggestion, il suffit de remplacer le signal cellDoubleClicked par un nouveau SLOT. C'est-à-dire, si vous voulez qu'aucune des cellules ne soit modifiée

0 votes

Pas besoin de faire ça, c'est pourquoi nous avons des drapeaux d'articles. Une seule ligne pour régler son problème.

0 votes

La différence est que vous devriez exclure le drapeau du bitmap sur tous ses éléments enfants . Ma suggestion était d'exclure l'écriture de 20 lignes avec &~ bitmap flag si vous voulez que le widget entier soit en lecture seule. En fait mon commentaire était faux de toute façon, il devrait dire déconnecter le signal cellDoubleClicked

0voto

firelight Points 69

Pour appliquer le code de @Narek aux lignes ou aux colonnes, il suffit d'utiliser une simple boucle for et d'ajouter une condition pour inclure les drapeaux des lignes/colonnes que vous ne souhaitez pas modifier.

Le code suivant lit un fichier csv dans 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();
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X