我正在使用 QGraphicsScene/View 开发一个自定义小部件,但我之前没有这方面的经验。
自定义小部件是一个图像查看器,需要跟踪鼠标移动并向其父对话框/窗口发送信号。信号将是鼠标光标下像素的位置及其颜色(RGB)。状态栏将使用该信息。
我使用 QGraphicsPixmapItem 来显示我从场景中的文件加载的图像。
谢谢。
我正在使用 QGraphicsScene/View 开发一个自定义小部件,但我之前没有这方面的经验。
自定义小部件是一个图像查看器,需要跟踪鼠标移动并向其父对话框/窗口发送信号。信号将是鼠标光标下像素的位置及其颜色(RGB)。状态栏将使用该信息。
我使用 QGraphicsPixmapItem 来显示我从场景中的文件加载的图像。
谢谢。
首先,您必须mouseMoveEvent
在自定义项目中实现。在此函数中,您可以轻松获取调用该pos
函数的鼠标位置。如果将项目的像素图转换为图像并调用pixel
函数,则可以获得 rgb 值。您应该考虑将QImage
as 成员变量存储为避免多次转换。最后,您必须发出自定义信号。示例代码如下:
void MyPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
{
QPointF mousePosition = event->pos();
QRgb rgbValue = pixmap().toImage().pixel(mousePosition.x(), mousePostion.y());
emit currentPositionRgbChanged(mousePosition, rgbValue);
}
请注意,默认情况下不支持信号/插槽QGraphicsItems
不继承。你也应该继承自。这就是这样做的。最后但并非最不重要的一点是,我建议您在您的QObject
QObject
QGraphicsObject
QGraphicsView
我发现 mouseMoveEvent 方法根本不起作用,至少在 Qt5.5 中不起作用。但是,在项目上使用 setAcceptHoverEvents(true) 启用悬停事件并重新实现 hoverMoveEvent(QGraphicsSceneHoverEvent * event) 就像一个魅力。mouseMoveEvent() 上的 Qt 文档提供了线索:
“如果你确实收到了这个事件,你可以确定这个项目也收到了鼠标按下事件”