Измените курсор, если вы переходите к QGraphicsRectItem Qt C++

Я хотел бы изменить курсор, если я иду по прямоугольнику, как QGraphicsRectItem,

У меня есть класс, который наследует от QGraphicsView и прямоугольники отображаются в виде QGraphicScene,

Я реализовал события мыши с eventFilter,

Проблема в том, что курсор меняется, когда я уже щелкнул по прямоугольнику, тогда как я хотел бы, чтобы он изменился, когда я передал его. Я уже сделал изменение курсора с помощью QAbstractButton, но QGraphicsRectItem::enterEvent(event) не работает.

Вот мой код с QAbstractButton:

void ToggleButton::enterEvent(QEvent *event) {
    setCursor(Qt::PointingHandCursor);
    QAbstractButton::enterEvent(event);
}

В этом случае это работает.

А вот мой код, чтобы определить, передам ли я прямоугольник:

DetecRect::DetecRect(QWidget* parent) : 
    QGraphicsView(parent)
{
     scene = new QGraphicsScene(this);
     pixmapItem=new QGraphicsPixmapItem(pixmap);
     scene->addItem(pixmapItem);
     this->setScene(scene);
     this->setMouseTracking(true);
     scene->installEventFilter(this);
}

bool DetecRect::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == scene){
        // press event
        QGraphicsSceneMouseEvent *mouseSceneEvent;
        if(event->type() == QEvent::GraphicsSceneMousePress){
            mouseSceneEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
            if(mouseSceneEvent->button() & Qt::LeftButton){

            }
        // move event
        } else if (event->type() == QEvent::GraphicsSceneMouseMove) {
            mouseSceneEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
             //selectedItem is a QGraphicsItem
            if(this->selectedItem && this->selectedItem->type() == QGraphicsRectItem::Type){
                selectedItem->setCursor(Qt::PointingHandCursor);
            }
        }
        // release event
        else if (event->type() == QEvent::GraphicsSceneMouseRelease) {
            mouseSceneEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
        }
    }
    return QGraphicsView::eventFilter(watched, event);
}

В этом коде курсор изменится, если я нажму на него один раз. Но не меняйся, если я пройду прямо по нему. Зачем?

1 ответ

Решение

Вам не нужно реализовывать метод hoverEnterEvent или hoverLeaveEvent, вам просто нужно установить курсор на элемент, как показано ниже:

#include <QApplication>
#include <QGraphicsRectItem>
#include <QGraphicsView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QGraphicsView view;
    QGraphicsScene *scene = new QGraphicsScene(&view);
    view.setScene(scene);

    QGraphicsRectItem *rit = scene->addRect(QRectF(-50, -50, 100, 100), QPen(Qt::black), QBrush(Qt::gray));
    rit->setCursor(Qt::CrossCursor);

    QGraphicsRectItem *rit2 = new QGraphicsRectItem(QRectF(-50, -50, 100, 100));
    rit2->setPen(QPen(Qt::white));
    rit2->setBrush(QBrush(Qt::green));
    rit2->setCursor(Qt::PointingHandCursor);
    rit2->setPos(200, 100);
    scene->addItem(rit2);

    view.resize(640, 480);
    view.show();
    return a.exec();
}
Другие вопросы по тегам