要在你的代码基础上实现视频水平翻转(镜像效果),可以通过 QGraphicsVideoItem
+ QGraphicsView
替换原有的 QVideoWidget
。以下是修改后的完整代码:
修改后的代码(实现水平翻转)
// 假设你在 UI 设计器中添加了一个 QWidget,对象名称为 videoContainer
QWidget *videoContainer = ui->widget1;
// 创建图形场景和视图容器
QGraphicsScene *scene = new QGraphicsScene(videoContainer);
QGraphicsView *graphicsView = new QGraphicsView(scene);
graphicsView->setStyleSheet("background: transparent; border: none;"); // 透明背景
// 创建 VideoItem 并设置水平翻转
QGraphicsVideoItem *videoItem = new QGraphicsVideoItem();
videoItem->setTransform(QTransform::fromScale(-1, 1)); // x轴缩放-1实现翻转
videoItem->setPos(videoContainer->width(), 0); // 补偿位置偏移(避免画面左移)
// 将 VideoItem 添加到场景中
scene->addItem(videoItem);
// 使用布局管理器适应容器大小 (可选)
QVBoxLayout *layout = new QVBoxLayout(videoContainer);
layout->addWidget(graphicsView);
layout->setContentsMargins(0, 0, 0, 0); // 去除边距
// 检查摄像头并启动
const QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
if (!cameras.isEmpty()) {
camera = new QCamera(cameras.first());
camera->setViewfinder(videoItem); // !!!关键:输出到 GraphicsVideoItem!!!
camera->start();
} else {
qWarning("No cameras available");
}
关键改动说明
替换
QVideoWidget
- 用
QGraphicsVideoItem
+QGraphicsView
替代原生的QVideoWidget
。 setTransform(QTransform::fromScale(-1, 1))
:通过 x轴负缩放实现水平翻转。
- 用
位置补偿
setPos(videoContainer->width(), 0)
:翻转后画面会向左偏移,需手动调整回原位。
性能优化
- Qt Graphics View Framework默认启用硬件加速,适合实时视频处理。
其他注意事项
- 动态调整窗口大小时:需要重写容器的
resizeEvent
,更新videoItem
的位置:
void YourClass::resizeEvent(QResizeEvent *event) {
if (videoItem) {
videoItem->setPos(event->size().width(), 0);
}
}
- OpenGL方案:如果需要更高性能(如60FPS以上),可参考之前的 OpenGL Shader方法。
如果需要进一步优化或解释某个细节,可以随时告诉我!
内容由零声教学AI助手提供,问题来源于学员提问