Как проверить положение wheelEvent в тексте QGraphicsTextItem?

У меня есть QGraphicsTextItem подкласс, который принимает события мыши (т.е. реализует wheelEvent() метод.

Как я могу проверить, в какой позиции в тексте произошло событие колеса? Я хотел бы получить письмо, на которое указал указатель мыши, когда произошло событие колеса.

Кстати: одним из возможных решений является создание серии QGraphicsTextItem объекты - по одному на каждую букву. Таким образом, каждое письмо может принимать свои собственные события, но я теряю всю сложность в кернинге и прочей верстке.

1 ответ

Решение

Чтобы получить положение мыши, вы можете использовать QWheelEvent::pos.

Я не вижу API для получения письма по данному QPointF в элементе. вы можете попытаться получить достаточно хорошее приближение, используя QFontMetricsF, делая что-то вроде

 const int wx = wheelEvent->pos().x(); //might have to map to item coordinates
 const qreal leftX = item->boundingRect().left();
 const QFontMetricsF fm( item->font() );
 int pos = 0;
 while ( fm.width( text.left( pos ) - leftX < wx )
      pos++; //could be optimized by something binary-search-like

Если это не сработает, вы можете попробовать с пользовательским текстовым элементом, где вы будете рисовать (QPainter::drawText) самостоятельно, так что у вас будет больше контроля над позицией текста в системе координат элемента.

Другие вопросы по тегам