簡體   English   中英

在Ubuntu的QT5中將透明QWidget放在QMediaView之上

[英]Put transparent QWidget on top of QMediaView in QT5 on Ubuntu

目標

我希望基於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;樣式background:transparent; (參見上面代碼中的注釋行)。 這使按鈕的背景透明,但按鈕后面的黑框現在更加明顯。

在此輸入圖像描述

其他嘗試

我已經在線閱讀了幾個關於如何做到這一點的技巧。 沒有人對我有用。 我曾嘗試使用QGraphicsScene和朋友,不同的布局堆棧,有問題的小部件上的不同屬性等等。 我的最后一次嘗試是將QVideoWidget的父級設置為QGLWidget()的實例,希望強制硬件加速能解決我的問題(我的計算機具有帶二進制驅動程序的硬件3d加速)。 這只是讓窗口完全無法顯示,而我仍然可以聽到背景中播放的視頻的音軌,表明應用程序仍在運行。

請求

我真的希望有一些善良和聰明的QT5開發人員可以幫助我實現我的夢想,即在Ubuntu的QT5中播放視頻的小部件。

謝謝!

我知道這是一個老問題,你設法通過將你的應用程序的部分轉換為QML / QtQuick 2.2來解決你的問題,但我最終通過谷歌搜索碰到了它,而其他有相同問題的人也可能會發現這個問題。 我找到了一個適用於我的解決方案,並已在Windows上使用QT 5.3進行了測試。

我所做的是使用QGraphicsView來顯示視頻。 這是我的代碼(playerScreen是QGraphicsView):

QGraphicsVideoItem *item = new QGraphicsVideoItem;
item->setSize(ui->playerScreen->size());
player.reset(new QMediaPlayer());
player->setVideoOutput(item);
QGraphicsScene *scene = new QGraphicsScene(0, 0, ui->playerScreen->size().width(), ui->playerScreen->size().height());
ui->playerScreen->setScene(scene);
ui->playerScreen->scene()->addItem(item);

我禁用了playerScreen上的滾動條,否則會有水平和垂直滾動條。

我在playerScreen的頂部有一個QWidget,我用QPainter繪制。 QWidget位於圖形視圖的頂部。

然后,當我播放視頻時,我會調用ui->playerScreen-show() 我只在游戲中這樣做,因為我在頂部有另一個屏幕(對於與我的項目相關的另一個東西),我需要在使用/不使用視頻時調用show / hide :)

如果您需要有關我的代碼的更多信息,請與我們聯系。

免責聲明:我沒有嘗試過這個解決方案。 它適用於Qt 4.8,可以將透明小部件放在OpenGL渲染的任何內容上。 我只是假設媒體播放正在使用硬件加速。

黑色像素是Qt的后備緩沖區,其中執行軟件渲染。 視頻繞過了這個后備緩沖區,當繪制一個“常規”qt小部件時,它會在后備緩沖區的頂部繪制,后備緩沖區仍處於初始狀態(黑色)。

您可以將按鈕(或包含按鈕的小部件)設置為單獨的透明窗口。

setWindowFlags(Qt::FramelessWindowHint | Qt::SplashScreen);
setAttribute(Qt::WA_TranslucentBackground);

你需要手動定位它,所以它跟隨你的窗口。 這意味着按鈕需要在窗口上安裝eventfilter,並監聽任何移動或調整事件大小。 然后它相對於窗口重新計算自己的位置,並更新它的位置。

qwidget4.1

void setAutoFillBackground(bool enabled)//你有這個方法,試試吧。

始終在論壇中搜索,因為有很多答案。 :)不是我想的,它對你來說更快。

具有完全透明背景的qt小部件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM