Russian Qt Forum
Сентябрь 30, 2024, 10:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] QTableWidget::itemAt/indexAt - странно понимают координаты  (Прочитано 3438 раз)
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-а, это действительно оказалось так.
Что я делаю не так?
Спасибо заранее.
« Последнее редактирование: Декабрь 19, 2011, 14:55 от Varan » Записан
_OLEGator_
Гость
« Ответ #1 : Декабрь 19, 2011, 14:24 »

Видимо надо сначала перевести координаты в систему координат виджета, а вот относительно нее потом и выбирать нужный элемент.
Код
C++ (Qt)
QPoint QWidget::mapFromGlobal ( const QPoint & pos ) const
QPoint QWidget::mapFromParent ( const QPoint & pos ) const
Записан
Varan
Гость
« Ответ #2 : Декабрь 19, 2011, 14:53 »

Ага, помогло:

Код
C++ (Qt)
QTableWidgetItem* selected = ui.data->itemAt(ui.data->viewport()->mapFromParent(devent->pos())); // !
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 20.