2009-10-16 1 views
3

Je travaille sur une application Windows, où dans une boîte de dialogue j'interroge certaines données de Postgres, et montre manuellement la sortie dans un widget de table.Qt: ItemAt() de TableWidget agissant bizarrement

m_ui->tableWidget->setRowCount(joinedData.count()); 
for(int i=0; i<joinedData.count(); i++) //for each row 
{ 
     m_ui->tableWidget->setItem(i, 0, new QTableWidgetItem(joinedData[i].bobin.referenceNumber)); 
     m_ui->tableWidget->setItem(i, 1, new QTableWidgetItem(QString::number(joinedData[i].bobin.width))); 
     m_ui->tableWidget->setItem(i, 2, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getHole()))); 
     m_ui->tableWidget->setItem(i, 3, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getLessThanZeroFive())));      m_ui->tableWidget->setItem(i, 4, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getZeroFive_to_zeroSeven()))); 
     m_ui->tableWidget->setItem(i, 5, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getZeroFive_to_zeroSeven_repetitive()))); 
     m_ui->tableWidget->setItem(i, 6, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getZeroSeven_to_Three()))); 
     m_ui->tableWidget->setItem(i, 7, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getThree_to_five()))); 
     m_ui->tableWidget->setItem(i, 8, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getMoreThanFive()))); 
} 

En outre, sur la base de la ligne et de colonne, je peins certains de ces tablewidgetitems à certaines couleurs, mais je ne pense pas que ce soit pertinent.

Je réimplémentées contextMenuEvent du QDialog, pour obtenir le droit cliqué sur la ligne de tableWidgetItem et la colonne Coordonnées:

void BobinFlanView::contextMenuEvent(QContextMenuEvent *event) 
{ 
    QMenu menu(m_ui->tableWidget); 
    //standard actions 
    menu.addAction(this->markInactiveAction); 
    menu.addAction(this->markActiveAction); 
    menu.addSeparator(); 
    menu.addAction(this->exportAction); 
    menu.addAction(this->exportAllAction); 

    //obtain the rightClickedItem 
    QTableWidgetItem* clickedItem = m_ui->tableWidget->itemAt(m_ui->tableWidget->mapFromGlobal(event->globalPos())); 



    // if it's a colored one, add some more actions 
    if (clickedItem && clickedItem->column()>1 && clickedItem->row()>0) 
    { 
     //this is a property, i'm keeping this for a later use 
     this->lastRightClickedItem = clickedItem; 
     //debug purpose: 
     QMessageBox::information(this, "", QString("clickedItem = %1, %2").arg(clickedItem->row()).arg(clickedItem->column())); 
     QMessageBox::information(this, "", QString("globalClick = %1, %2\ntransformedPos = %3, %4").arg(event->globalX()).arg(event->globalY()) 
           .arg(m_ui->tableWidget->mapFromGlobal(event->globalPos()).x()).arg(m_ui->tableWidget->mapFromGlobal(event->globalPos()).y())); 

     menu.addSeparator(); 

     menu.addAction(this->changeSelectedToleranceToUygun); 
     menu.addAction(this->changeSelectedToleranceToUyar); 
     menu.addAction(this->changeSelectedToleranceToDurdurUyar); 

     //... some other irrevelant 'enable/disable' activities 

    menu.exec(event->globalPos()); 
} 

Le problème est, quand je clique droit sur le même article que je reçois les mêmes coordonnées globales, mais au hasard différents informations sur les lignes et les colonnes. Par exemple, le pos global est exactement 600,230 mais la paire ligne-colonne est aléatoirement (5,3) et (4,3). Je veux dire quoi?!

Aussi, lorsque je clique sur un élément de la dernière aux lignes (au plus tard le 13, je suppose) ne sera jamais en état « si (clickedItem & & clickedItem-> colonne()> 1 & & clickedItem-> rangée()> 0) ", je pense que c'est principalement parce que 'clickedItem' est nul.

Je serai très heureux de partager plus d'informations, ou même le trio complet cpp-h-ui afin d'obtenir de l'aide.

Merci beaucoup.

Répondre

3

Essayez ceci:

QTableWidgetItem* clickedItem = m_ui->tableWidget->itemAt(event->pos()); 

Le problème est que vous essayez de cartographier la position globale à la position de widget table, sans tenir compte de la zone défilante. Pour mapper la position globale en quelque chose que vous pouvez passer à itemAt, utilisez tableWidget->viewport()->mapFromGlobal.

+0

merci un million:] cela fonctionne comme un charme. – emredog

0

Est venu pour remercier Lukáš Lalinský, comme son explication a mis fin à une demi-journée de misère pour moi.

Dans mon cas, itemAt() lorsqu'il est alimenté par QDropEvent :: pos(), était de retour d'articles d'une ligne de table, compensée par 1.

La raison était que j'avais une tête horizontale , qui rétrécissait la fenêtre, même avec la tête verticale, mais comme il était très étroit, je ne me rendais pas compte que cela causait aussi un décalage. Le correctif consistait à appeler viewport() -> mapFromParent ([drop pos]) de QTableWidget, car la position était déjà dans les coordonnées QTableWidget.

Encore une fois, merci beaucoup!

+0

La meilleure façon de remercier quelqu'un est d'accepter la réponse et de voter pour la réponse utile. – sirandy

+0

Merci pour le rappel, je l'avais déjà upvoted, mais étant donné que je suis nouveau ici, ma voix ne contribue pas au score de réponse officielle. Quant à l'acceptation - c'est pour l'auteur du fil d'origine, n'est-ce pas? – raverman

+0

Ouais est pour lui. – sirandy