2 votes

QTableWidget omet certains itèmes, les éléments sont créés mais ignorés.

J'ai deux projets différents où j'utilise QTableWidget et j'ai le même problème dans les deux. J'essaie de remplir le QTableWidget avec new QTableWidgetItem mais certains éléments sont manquants, ils ne sont pas représentés dans le tableau. Le problème apparaît avec les compilateurs MinGW et MSVC. Je l'ai essayé avec les versions 5.12.1 et 5.12.5 de Qt. Veuillez m'aider à comprendre ce qui ne va pas.

J'utilise un code très simple comme ci-dessous Dans un projet, si j'appelle createItems() deux fois de suite pour que le tableau soit rempli mais l'autre projet utilise un tableau plus grand donc ce code fonctionne si je l'appelle beaucoup plus de fois, mais pas complètement de toute façon

void MainWindow::createItems()
{
    for (int r = 0; r < ui->tableWidget->rowCount(); ++r)
    {
        for (int c = 0; c < ui->tableWidget->columnCount(); ++c)
        {
            QTableWidgetItem *pi = ui->tableWidget->item(r, c);
            if (pi != nullptr) continue;
            pi = new QTableWidgetItem();
            ui->tableWidget->setItem(r, c, pi);
            qDebug() << r << c << pi << ui->tableWidget->item(r, c)
                     << (pi == ui->tableWidget->item(r, c));
        }
    }
}

c'est une partie de la sortie de qDebug

0 0 0x2c4af2f0 0x2c4af2f0 true
0 1 0x2c4af970 0x2c4af970 true
0 2 0x2c4af9b0 0x2c4af9b0 true
0 3 0x2c4afa70 0x2c4afa70 true
0 4 0x2c4aeb30 0x2c4aeb30 true
0 5 0x2c4aecb0 0x2c4aecb0 true
1 0 0x2c4aed30 0x2c4aed30 true
1 1 0x2c4aedf0 0x2c4aedf0 true
1 2 0x2c4aee30 0x2c4af9b0 false
2 0 0x2c4afdf0 0x2c4afdf0 true
2 1 0x2c4aeef0 0x2c4aeef0 true
2 2 0x2c4aef30 0x2c4af9b0 false

veuillez prêter attention à (1, 2) et (0, 2) et (2, 2), pourquoi cela se produit-il ?

et ensuite je remplis les éléments dans un cycle comme ci-dessous. Le code se plante lorsque tous les éléments ne sont pas créés, il est évident que le pointeur de l'élément est nul mais je suis sûr qu'il a été créé.

for (int r = 0; r < rows_amount; ++r)
{
    ui->tableWidget->item(r, 0)->setData(Qt::DisplayRole, r);
    ui->tableWidget->item(r, 1)->setData(Qt::DisplayRole, r+1);
}

dans le second projet, je remplis les éléments lorsqu'ils sont créés par la commande 'new', puis j'appelle quelque chose comme pTable->setItem(r, c, pItem)

Dans le deuxième projet où setItem est utilisé, le tableau ressemble à ceci (mon exemple réel)

Il fonctionne normalement sur certains ordinateurs, et le code est simple, donc je n'ai aucune idée de ce que je fais de travers.

0voto

Mahi Points 28

Il semble que le pointeur Item ne soit pas nul ! Pouvez-vous vérifier s'il entre dans la condition if ?

Vous devriez probablement les supprimer et les annuler dans ces cas-là.

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