Tooltip на объектах QListView с фиксированныи положением Qt c++
Нужно, чтобы tooltip имел фиксированное положение относительно объекта QListView. Внутри простая модель, строку передает без фокусов(почти), tooltip через роль Qt::ToolTipRole из модели. Динамически вычислять нужное положения для tooltip'а мне видится вполне реальным, можно кеширивать даже,основная проблема в следующем: Чтобы переопределять позицию окошка подсказки, планировалось унаследоваться от QListView, и там переопределить метод bool event(QEvent *pe) override
Прим.
class MyView : public QListView {
public:
MyView(QWidget *parent) : QListView(parent) {}
bool event(QEvent *pe) override {
if (pe->type() == QEvent::ToolTip)
//CODE!
return QListView::event(pe);
}
};
Но такая логика не взлетела, события tooltip вызываются при наведении мышкой на пустые области списка, но не на элементы. Как переопределить для элементов списка?
Ответы (1 шт):
Решение было найдено опытным путем, переопределяя helpEvent в делегате:
bool StartScreenHistiryListDelegate::helpEvent(
QHelpEvent *event, QAbstractItemView *view,
const QStyleOptionViewItem &option, const QModelIndex &index) {
if (event->type() == QEvent::ToolTip) {
//Динамичесское вычесление позиции ToolTip
QPoint globalToolTipPositionWithOffset(
view->mapToGlobal({0, 0}).x() +
option.fontMetrics
.size(Qt::TextSingleLine,
index.data().toString())
.width() +
20,
view->mapToGlobal({0, 0}).y() - 15 +
(sizeHint(option, index).height() * index.row()));
QHelpEvent modernEvent(QEvent::ToolTip, event->pos(),
globalToolTipPositionWithOffset);
QStyledItemDelegate::helpEvent(&modernEvent, view, option, index);
return true;
}
return false;
}
Здесь перехватывается событие QEvent::ToolTip, и создается новое, с новой позицией.
Этот код показывает ToolTip за последней буквой строки QListView