2009-10-16 3 views
3

Я работаю над приложением Windows, где в диалоговом окне я запрашиваю некоторые данные из Postgres и вручную показываю вывод в виде виджета таблицы.Qt: TableWidget's 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 в некоторых цветов, но я не думаю, что это отношение.

Я переписана ContextMenuEvent в QDialog, в получить право щелкнул строку и столбец 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()); 
} 

Проблема заключается в том, когда я щелкните правой кнопкой мыши на одном пункте я получаю те же глобальные координаты, но случайно разные строка-колонка. Например, глобальный pos равен ровно 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

0

Пришел сюда, чтобы поблагодарить Lukáš Lalinský, так как его объяснение положило конец полдня страданий для меня.

В моем случае, ItemAt() при скармливании QDropEvent :: поз(), возвращался элементы из строки таблицы, компенсируется 1.

Причина в том, что у меня был горизонтальный заголовок , который уменьшил область просмотра, то же самое с вертикальным заголовком, но поскольку он был очень узким, я не понимал, что это тоже вызвало смещение. Исправление должно было вызвать QTableWidget's viewport() -> mapFromParent ([drop pos]), поскольку позиция уже была в координатах QTableWidget.

Опять же, спасибо МНОГО!

+0

Лучший способ поблагодарить кого-то - это принять ответ и голосовать за полезный ответ. – sirandy

+0

Спасибо за напоминание, я уже его поддержал, но из-за того, что я здесь новый, мой голос не способствует официальному счету ответа. Что касается принятия - это для автора исходного потока, не так ли? – raverman

+0

Да, для него. – sirandy

Смежные вопросы