- 如果只是显示一张图片,没有多层显示的情况下,可以直接将视图坐标转图像坐标(场景坐标),再通过图像的像素指针获取该点的像素值
void CustomGraphicsView::rgbValueInImage(QPoint pos){
if(d->currentImage.isNull()) return; //d->currentImage 当前显示的图像
QPoint imagePos = mapToScene(pos).toPoint();
if(imagePos.x() >= 0 && imagePos.y() >= 0 &&
imagePos.x() < d->currentImage.width() && imagePos.y() < d->currentImage.heigth()){
QColor color = QColor::fromRgb(d->currentImage.pixel(imagePos));
QToolTip::showText(mapToGlobal(pos),QString("R:%1,G:%2,B:%3")
.arg(color.red())
.arg(color.green())
.arg(color.blue()));
}
}
//调用
void CustomGraphicsView::mouseMoveEvent(QMouseEvent* event){
rgbValueInImage(event->pos());
QGraphicsView::mouseMoveEvent(event);
}
2.通过图标坐标再通过显示原图获取坐标值方式却不适合有多层的情况,接下来采用QGraphicsScene的render渲染出需要的图片获取像素值
void CustomGrapphicsView::rgbValueInImages(QPoint pos){
auto renderSceneToImage = [this](QRectF& sceneRect)->QImage{
QImage image(sceneRect.size().toSize(),QImage::Format_ARGB32);
QPainter painter(&image);
scene()->render(&painter,QRectF(),sceneRect);
return image;
}
QRectF rect(mapToScene(pos),QSize(1,1)); //创建坐标点1*1的矩形
QColor color = QColor::fromRgb(renderSceneToImage(rect).pixel(QPoint(0,0)));
QToolTip::showText(mapToGlobal(pos),QString("R:%1,G:%2,B:%3")
.arg(color.red())
.arg(color.green())
.arg(color.blue()));
}
//调用同方法1
总结:代码都是基于自定义QGraphicsView的内部接口写的,在鼠标移动事件调用即可,两种方式各有优缺点,根据不同的需求场景自行选择。由于本人水平有限,如有错误,请多见谅!