Я хотел бы изменить курсор, если я иду по прямоугольнику, как 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);
}
В этом коде курсор изменится, если я нажму на него один раз. Но не меняйся, если я пройду прямо по нему. Зачем?
Вам не нужно реализовывать метод 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();
}
Других решений пока нет …