2009-10-16 26 views
3

我正在處理一個Windows應用程序,在對話框中我從Postgres中查詢一些數據,並手動在表格窗口小部件中顯示輸出。Qt:TableWidget的ItemAt()代理奇怪

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()))); 
} 

此外,根據行和列的信息,我畫一些tablewidgetitems一些色彩,但我不認爲這是相關的。

我重新實現了QDialog的的的ContextMenuEvent,獲得點擊tableWidgetItem的行和列的右座標:

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()); 
} 

的問題是,當我用鼠標右鍵單擊同一項目我會得到相同的全局座標,而是隨機的不同行列信息。例如,全局值恰好爲600,230,但行列對是隨機的(5,3)和(4,3)。我的意思是,什麼?!

此外,當我點擊一個項目從最後行(不遲於13,我猜)將永遠不會進入狀態「如果(clickedItem & & clickedItem->列()> 1 & & clickedItem->行()> 0)「,我認爲這主要是因爲'clickedItem'爲null。

我很樂意分享任何更多的信息,甚至是完整的cpp-h-ui三重奏以獲得幫助。

非常感謝。

回答

3

試試這個:

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

的問題是,你試圖映射全球定位表部件的位置,不考慮滾動區域。要將全局位置映射到您可以傳遞至itemAt的位置,請使用tableWidget->viewport()->mapFromGlobal

+0

感謝一百萬:]它像一個魅力。 – emredog 2009-10-19 06:51:34

0

來到這裏感謝LukášLalinský,因爲他的解釋結束了我半天的痛苦。

在我的情況,itemAt()當與QDropEvent :: POS(FED),是從一個錶行返回的項目,由1

原因偏移是,我不得不水平頭,縮小視口,與垂直標題相同,但由於它非常窄,我沒有意識到它也造成了偏移。 解決的辦法是調用QTableWidget的viewport() - > mapFromParent([drop pos]),因爲位置已經在QTableWidget座標中。

再一次,非常感謝!

+0

感謝某人的最佳方式是接受答案並投票選出有用答案。 – sirandy 2017-06-08 19:37:44

+0

感謝提醒,我已經提出了這個提議,但是由於我在這裏是新人,我的聲音並沒有對官方答案分數作出貢獻。至於接受 - 這是爲原始主題作者,是不是? – raverman 2017-06-09 08:03:52

+0

是的,他是。 – sirandy 2017-06-09 13:55:33