QT中QGraphicsView无法实现视频内容完全填充的问题求助
问题原因与解决方法
你遇到的是Qt图形视图播放视频的几个常见适配误区,按以下步骤修改即可解决:
- 先修正API大小写错误:你使用的
fitinView命名错误,Qt标准API为驼峰格式fitInView - 不要在初始化阶段直接调用适配逻辑:
QGraphicsVideoItem的尺寸会在视频流加载完成后才会更新,初始化阶段item尺寸为空,此时调用适配逻辑没有效果 - 关闭视图默认滚动条、修改对齐方式:避免默认居中对齐产生的偏移,以及滚动条占用空间导致视频无法铺满
- 监听窗口/视图尺寸变化:窗口大小调整时同步重新适配视频尺寸
修改后可直接运行的代码
// 头文件中提前声明对应内容: // private slots: // void onVideoSizeChanged(const QSizeF &size); // void resizeEvent(QResizeEvent *event) override; // private: // QGraphicsVideoItem *item = nullptr; // QMediaPlayer* player = nullptr; // 业务逻辑代码 player = new QMediaPlayer(this); item = new QGraphicsVideoItem; player->setVideoOutput(item); // 配置GraphicsView基础参数 ui->graphicsView->setScene(new QGraphicsScene(this)); ui->graphicsView->scene()->addItem(item); // 关闭滚动条 ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 对齐改为左上,避免默认居中产生的偏移 ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop); // 监听视频尺寸变化信号,首次加载完成后自动适配 connect(item, &QGraphicsVideoItem::nativeSizeChanged, this, [=](const QSizeF &size){ // 第二个参数可根据需求选择: // Qt::IgnoreAspectRatio 直接拉伸填满,允许视频变形 // Qt::KeepAspectRatioByExpanding 保持宽高比铺满,超出视图的部分会被裁剪 // Qt::KeepAspectRatio 保持宽高比完整显示,空余区域留黑边 ui->graphicsView->fitInView(item, Qt::IgnoreAspectRatio); }); player->setMedia(QUrl("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")); player->play(); // 重写resizeEvent,窗口大小变化时重新适配 void YourWidgetClass::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); if (item && player->mediaStatus() >= QMediaPlayer::BufferedMedia) { ui->graphicsView->fitInView(item, Qt::IgnoreAspectRatio); } }
内容的提问来源于stack exchange,提问作者goodkid38
相关产品推荐
相关产品推荐

