这里没有什么新的东西。
我混合了被接受的回复https://dev59.com/dGsy5IYBdhLWcg3w8Slc#8212120和https://dev59.com/dGsy5IYBdhLWcg3w8Slc#43936590,它使用了setContentsMargins
,但是我按照自己的方式编写了一些代码。
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)。
QLabel
的尺寸。QPixmap
应该保持其大小、内容和尺寸。此外,如果调整大小(实际上是缩小)可以“自动地”填充可用空间,直到原始QPixmap
的大小,那就太好了。所有这些都是通过子类化完成的... - marvin2k