【发布时间】:2013-05-29 03:58:55
【问题描述】:
目标
我希望基于 QT5 的 GUI 的背景是正在播放的视频文件。我还希望能够为我的 GUI 组件设置透明样式,以便视频可以通过它们显示。
我不确定这是否有可能实现。可能是我错过了一个重要的线索(我毕竟是 Qt 初学者),也可能是它根本不适合工作。但作为一个乐观主义者,我已经尽力了。
第一次尝试
我最小的第一次尝试是这样的:
int main( int argc, char **argv ){
QApplication app(argc, argv);
QMediaPlayer *media=new QMediaPlayer(0);
QVideoWidget *video=new QVideoWidget(0); //new QGLWidget()
media->setVideoOutput(video);
media->setMedia(QUrl::fromLocalFile("/tmp/avatar.mp4"));
media->setPosition(3000000);
media->play();
QPushButton *pb=new QPushButton(video);
pb->setText(QString("BOB"));
//pb->setStyleSheet(QString("background:transparent;"));
video->show();
return app.exec();
}
按钮在播放视频的顶部,这很好。但是如果你仔细观察,你会在按钮的角落看到一些黑色像素,表明它在视频中不是透明的,而是呈现为一个不透明的矩形。
第二次尝试
我尝试使用background:transparent; 设置按钮的样式(参见上面代码中的注释行)。这使得按钮的背景透明,但按钮后面的黑框现在更加明显。
其他尝试
我已经从网上的各种来源阅读了一些关于如何做到这一点的提示。没有一个对我有用。我尝试过与 QGraphicsScene 和朋友一起工作,不同的布局堆栈,有问题的小部件上的不同属性等等。我最后一次尝试是将 QVideoWidget 的父级设置为 QGLWidget() 的一个实例,希望强制硬件加速能够解决我的问题(我的计算机具有带二进制驱动程序的硬件 3d 加速)。这只是完全阻止了窗口出现,而我仍然可以听到在后台播放的视频的配乐,表明应用程序仍在运行。
请求
我真的希望有一些善良和聪明的 QT5 开发人员可以帮助我实现在 Ubuntu 上将小部件放置在 QT5 播放视频顶部的梦想。
谢谢!
【问题讨论】:
-
我几乎在所有方面都做了这个,我认为这是不可行的 - 从 QT 4.8 恕我直言,这是一个糟糕的回归。不过,我对您的问题给予了赏金,希望有人能启发我们……
-
我也得出了同样的结论。从那以后(我不得不承认,我很不情愿地)将我的应用程序的一部分转换为 QML/QtQuick 2.2 来解决这个问题。这突然为我们打开了一个全新的灵活性和生产力世界。不幸的是,这也使我们的应用程序依赖于目标硬件上可用的 GPU 资源。这给我们带来了一些问题,但我们仍然很高兴已经皈依。感谢您的赏金!
-
不幸的是,我无法转向 QML(插入 libvlc 原因)。有趣的是它的工作原理......最好的问候。
标签: c++ ubuntu video user-interface qt5