web-dev-qa-db-fra.com

Comment créer une colonne dans QTableWidget en lecture seule?

Je voudrais avoir une colonne dans QTableWidgetNOTeditable.
Sur les forums, j’ai beaucoup lu à propos de flags mais je n’arrivais pas à mettre en œuvre.

55
Narek

Insérer dans le QTableWidget le type d’éléments suivant:

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

Fonctionne bien!

MODIFIER:

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

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

85
Narek

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 vous assurer que l’édition est désactivée quel que soit le réglage actuel.

34
user2923436

Je suis venu à une meilleure suggestion, écrasez simplement le signal cellDoubleClicked avec un nouveau SLOT . Ceci est, si vous voulez qu'aucune des cellules ne soit modifiée

1
Damdidam

Pour appliquer le code de @ Narek à des lignes ou à des colonnes, utilisez simplement une simple boucle for et définissez une condition pour inclure les indicateurs des lignes/colonnes que vous ne souhaitez pas pouvoir 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();
        }
    }
}
0
Tim Hutchison