Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Varan от Декабрь 19, 2011, 14:16



Название: [решено] QTableWidget::itemAt/indexAt - странно понимают координаты
Отправлено: Varan от Декабрь 19, 2011, 14:16
Qt 4.7.1, Windows 7, MSVC

Есть QTableWidget, примерно вот такой
Код
C++ (Qt)
ui.data->setDragDropMode(QAbstractItemView::DropOnly);
ui.data->installEventFilter(this);
ui.data->setColumnCount(labels.size());
ui.data->setHorizontalHeaderLabels(labels);
ui.data->setRowCount(count);
ui.data->setSelectionBehavior(QAbstractItemView::SelectRows);
 

И есть функция eventFilter, примерно вот такая:

Код
C++ (Qt)
bool object::eventFilter(QObject* watched, QEvent* event)
{
if (watched == ui.data)
{
// <...>
else if (event->type() == QEvent::Drop)
{
QDropEvent* devent = static_cast<QDropEvent*>(event);
assert(devent);
QTableWidgetItem* selected = ui.data->itemAt(devent->pos()); // ?
ui.data->selectRow(selected->row());
return true;
}
return ui.data->eventFilter(watched, event);
}
return false;
}
 

Только такое чувство, что itemAt (а если поменять на индексы, то и indexAt) возвращает элемент в координатах, Y которых как будто бы отсчитывается не от верхнего края виджета, а от нижнего края ui.data->horizontalHeaderView().
То есть фактически выделен оказывается элемент ниже того, на который действительно попал курсор. Причем я проверил, меняя высоту header-а, это действительно оказалось так.
Что я делаю не так?
Спасибо заранее.


Название: Re: QTableWidget::itemAt/indexAt - странно понимают координаты
Отправлено: _OLEGator_ от Декабрь 19, 2011, 14:24
Видимо надо сначала перевести координаты в систему координат виджета, а вот относительно нее потом и выбирать нужный элемент.
Код
C++ (Qt)
QPoint QWidget::mapFromGlobal ( const QPoint & pos ) const
QPoint QWidget::mapFromParent ( const QPoint & pos ) const


Название: Re: QTableWidget::itemAt/indexAt - странно понимают координаты
Отправлено: Varan от Декабрь 19, 2011, 14:53
Ага, помогло:

Код
C++ (Qt)
QTableWidgetItem* selected = ui.data->itemAt(ui.data->viewport()->mapFromParent(devent->pos())); // !