如何显示 QGraphicsPixmapItem 中的像素位置和颜色

发布于 2025-01-02 22:23:38 字数 197 浏览 0 评论 0原文

我正在使用 QGraphicsScene/View 开发一个自定义小部件,但我之前没有任何经验。

自定义小部件是一个图像查看器,需要跟踪鼠标移动并向其父对话框/窗口发送信号。信号将是鼠标光标下像素的位置及其颜色(RGB)。状态栏将使用该信息。

我使用 QGraphicsPixmapItem 来显示从场景中的文件加载的图像。

谢谢。

I'm developing a custom widget with QGraphicsScene/View and I have no prior experience with it.

The custom widget is an image viewer that needs to track mouse movement and send signal(s) to it's parent dialog / window. The signal(s) will be the position of the pixel under the mouse cursor and it's color (in RGB). A status bar will use that information.

I use a QGraphicsPixmapItem to display the image I load from a file in the scene.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

云淡月浅 2025-01-09 22:23:38

首先,您必须实现 mouseMoveEvent在您的自定义项目中。在此函数中,您可以通过调用 pos 函数。如果将项目的像素图转换为图像并调用 像素函数。您应该考虑将 QImage 存储为成员变量,以避免多次转换。最后你必须发出一个自定义信号。示例代码如下:

void MyPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
{
    QPointF mousePosition = event->pos(); 
    QRgb rgbValue = pixmap().toImage().pixel(mousePosition.x(), mousePosition.y());
    
    emit currentPositionRgbChanged(mousePosition, rgbValue);
}

注意QGraphicsItems 不继承自QObject,因此默认情况下不支持信号/槽。您还应该继承QObject。这就是 QGraphicsObject 的作用。最后但并非最不重要的一点是,我建议您启用 鼠标跟踪 在你的QGraphicsView

First of all you have to implement the mouseMoveEvent in your custom item. In this function you can easily get the mouse position calling the pos function. You can get the rgb value if you transform the item's pixmap into image and call the pixel function. You should consider storing the QImage as member variable in order to avoid multiple transformations. Finally you have to emit a custom signal. Sample code follows:

void MyPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
{
    QPointF mousePosition = event->pos(); 
    QRgb rgbValue = pixmap().toImage().pixel(mousePosition.x(), mousePosition.y());
    
    emit currentPositionRgbChanged(mousePosition, rgbValue);
}

Notice that QGraphicsItems do not inherit from QObject so by default signals/slots are not supported. You should inherit from QObject as well. This is what QGraphicsObject does. Last but not least I would advise you to enable mouse tracking on your QGraphicsView

昨迟人 2025-01-09 22:23:38

我发现 mouseMoveEvent 方法根本不起作用,至少在 Qt5.5 中不起作用。然而,在项目上使用 setAcceptHoverEvents(true) 启用悬停事件并重新实现hoverMoveEvent(QGraphicsSceneHoverEvent * event) 非常有效。
mouseMoveEvent() 上的 Qt 文档提供了线索:

“如果您确实收到此事件,则可以确定该项目也收到了鼠标按下事件”

http://doc.qt.io/qt-5.5/qgraphicsitem.html#mouseMoveEvent

I found the mouseMoveEvent approach to not work at all, at least not with Qt5.5. However, enabling hover events with setAcceptHoverEvents(true) on the item and reimplementing hoverMoveEvent(QGraphicsSceneHoverEvent * event) worked like a charm.
The Qt docs on mouseMoveEvent() provide the clue:

"If you do receive this event, you can be certain that this item also received a mouse press event"

http://doc.qt.io/qt-5.5/qgraphicsitem.html#mouseMoveEvent

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文