这里真的没有什么新鲜事。
我将接受的回复
https://stackoverflow.com/a/8212120/11413792
和
https://stackoverflow.com/a/43936590/11413792混合
使用setContentsMargins
,但只是以我自己的方式对其进行了编码。
/**
* @brief calcMargins Calculate the margins when a rectangle of one size is centred inside another
* @param outside - the size of the surrounding rectanle
* @param inside - the size of the surrounded rectangle
* @return the size of the four margins, as a QMargins
*/
QMargins calcMargins(QSize const outside, QSize const inside)
{
int left = (outside.width()-inside.width())/2;
int top = (outside.height()-inside.height())/2;
int right = outside.width()-(inside.width()+left);
int bottom = outside.height()-(inside.height()+top);
QMargins margins(left, top, right, bottom);
return margins;
}
一个函数计算将一个矩形居中另一个矩形所需的边距。它是一个非常通用的函数,虽然我不知道是什么,但它可以用于很多事情。
然后setContentsMargins
通过几条额外的线变得易于使用,许多人会将它们组合成一条线。
QPixmap scaled = p.scaled(this->size(), Qt::KeepAspectRatio);
QMargins margins = calcMargins(this->size(), scaled.size());
this->setContentsMargins(margins);
setPixmap(scaled);
它可能会引起某人的兴趣……我需要处理mousePressEvent
并知道我在图像中的位置。
void MyClass::mousePressEvent(QMouseEvent *ev)
{
QMargins margins = contentsMargins();
QPoint labelCoordinateClickPos = ev->pos();
QPoint pixmapCoordinateClickedPos = labelCoordinateClickPos - QPoint(margins.left(),margins.top());
... more stuff here
}
我的大图像来自相机,我通过除以像素图的宽度然后乘以原始图像的宽度来获得相对坐标 [0, 1)。