原文地址
前言
如果我们希望子组件的图片/影片始终以cover
模式展示,如果没有找到直接设置的选项,那么我们这里选择通过resizeEvent
和起始坐标来完成
事件监听
//h
class IndexWidget : public QWidget
{
//...
void resizeEvent(QResizeEvent*);
}
//cpp
void IndexWidget::resizeEvent(QResizeEvent*)
{
// cover size param
int height = 0;
int width = 0;
int y = 0;
int x = 0;
// cover size comput
QSize cameraSize = camera->getDefaultCamerResolution();
double cameraAspectRatio = ( double )cameraSize.width() / cameraSize.height();
QSize widgetSize = mainFrame->size();
double widgetAspectRatio = ( double )widgetSize.width() / widgetSize.height();
if (cameraAspectRatio > widgetAspectRatio)
{
height = widgetSize.height();
width = height * cameraAspectRatio;
x = (widgetSize.width() - width) / 2;
}
else
{
width = widgetSize.width();
height = width / cameraAspectRatio;
y = (widgetSize.height() - height) / 2;
}
camera->resizeCameraShow(x, y, width, height);
}
我们这里通过相机的横纵比和当前框架的横纵比进行比较,判断应该横向延展还是竖向延展,之后计算出偏移量和延展长度即可
resize
//cpp
void Camera::resizeCameraShow(int x, int y, int width, int height)
{
this->setGeometry(x, y, width, height);
m_graphicsVideoItem->setSize(QSizeF(width, height));
}
注意
-
如果使用的是
QGraphicsView
作为载体的话,我们需要隐藏滚轮,Qt5
的方法名略有不同m_cameraView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_cameraView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);