QTreeView, как вызвать действие при наведении мыши на строку?

Я использую С++ Qt5. В настоящее время у меня есть QStandardItemModel, отображаемый как QTreeView с несколькими строками и столбцами. Я знаю об использовании setStyleSheet(), но это просто меняет цвет строки. Что я ищу, так это то, что когда мышь наводит курсор на строку, вызывается функция, которую я затем могу использовать для управления своей игрой.


person Ender    schedule 23.11.2018    source источник
comment
Не могли бы вы объяснить мне лучше, какие данные вам нужны из строки, или вы хотите, чтобы эта функция вызывалась только при изменении строк?   -  person eyllanesc    schedule 23.11.2018
comment
Я ищу уникальный идентификатор из каждой строки/столбца, и когда я наводил курсор на строку/столбец, вызывается функция с уникальным идентификатором из строки и столбца.   -  person Ender    schedule 24.11.2018
comment
вы могли бы предоставить более подробную информацию об идентификаторе, помимо предоставления минимального воспроизводимого примера, для отслеживания наведения вы можете использовать mouseMoveEvent метод QTreeView или editorEvent делегата. Ваш текущий вопрос частично ясен, но частично вводит в заблуждение, поэтому нам нужно больше деталей.   -  person eyllanesc    schedule 24.11.2018
comment
Я согласен с @eyllanesc, я бы перегрузил mouseMoveEvent(). Может быть, для этого стоит упомянуть QTreeView::indexAt(), который Возвращает индекс модели элемента в точке координат окна просмотра.   -  person Scheff's Cat    schedule 24.11.2018


Ответы (1)


Вы можете использовать делегат (http://doc.qt.io/qt-5/qtwidgets-itemviews-stardelegate-example.html) и QStyle::State_MouseOver, чтобы проверить, находится ли указатель мыши над строкой. Вы должны переопределить метод paint.

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    if(index.row() == 2 && (option.state & QStyle::State_MouseOver)) {
        painter->fillRect(option.rect, Qt::blue);
    } else {
        QStyledItemDelegate::paint(painter, option, index);
    }
}
person Andrey Semenov    schedule 26.11.2018
comment
setMouseTracking(true) должен быть вызван первым для представления элементов, иначе QStyle::State_MouseOver не будет установлен в option.state. - person Jruv; 08.01.2021