衆所周知 Mplayer 播放有 -wid + 視窗句柄 的指令,可以讓Mplayer嵌入指定視窗播放。
是以隻有利用該指令就可以讓Mplayer在Qt指定的視窗或控件播放視訊,
實作平台 Ubuntu 16.04
QWidget 實作方法:
QWidget可以很簡單的擷取控件的wid ,是以隻需要直接執行指令就可以實作嵌入
void MainWindow::on_pushButton_clicked()
{
qDebug() << "on touch..." ;
play = new QProcess;
QString order = QString("mplayer -quiet -slave -x 600 -y 300 -wid %1 %2").arg(/*this->winId()*/ui->label->winId()).arg(ui->label_2->text());
qDebug() << order ;
play->start(order);
}
隻需要小小的簡單的辦法就可以實作Mplayer播放器的嵌入了
效果
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR9kMnR1T4FEVNFDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0kjMwIjMyETM0EzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
QML 實作方法:
QML 無法簡單的擷取視窗句柄,是以需要一些小小的辦法,
WId *getQmlWid(QObject *QmlObj)
{
WId *parent_HWND = new WId;
QWindow *QmlWindow=qobject_cast<QWindow *>(QmlObj);//擷取qml的視窗
*parent_HWND = QmlWindow->winId();
qDebug() << "id Get" <<QmlWindow->winId() ;
return parent_HWND;
}
通過上述函數可以擷取QML視窗的WID,接着隻需要
void playerTest::mplayerPlay()
{
play = new QProcess;
QString order = QString("mplayer -quiet -slave -x 600 -y 300 -wid %1 test.mp4").arg(*this->parent_HWND);
qDebug() << order ;
play->start(order);
}
照樣執行Mplayer播放指令就行了,但是QML 目前我還沒能實作擷取控件的操作句柄,是以,Mplayer 嵌入QML 是直接嵌入整個視窗,如果在該視窗上顯示控件的話,會出現控件和視訊畫面搶重新整理的情況,就是控件閃爍,這可能是和QML和Mplayer本身的原因,要解決的話也不是目前我這個級别的人幹的,是以,偷偷雞,直接弄個透明視窗蓋在Mplayer視窗上面就完事了
這樣也是沒問題的,還能做成點選才顯示操作按鈕,炫酷程度還是可以的
但是肯定有些人又需要Qwidget那樣顯示在劃定的控件中而不是整個視窗,那樣的話就得祭出我的最終方案了,有二,但是播放就懶得做了,就是:
QWidget視窗嵌入QML 視窗,這樣就可以直接擷取QWidget 視窗裡面控件的操作句柄,方法如下
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//======================執行個體化一個QML界面=============================//
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/MainQml.qml")));
if(engine.rootObjects().isEmpty())
return -1;
MainWindow w;//執行個體化一個QWidget界面
w.winId();//擷取winID ,不使用會失敗
w.setAttribute(Qt::WA_NativeWindow);//将其設定為子視窗
//需要調用QWindow檔案
w.windowHandle()->setParent( qobject_cast<QWindow *>(engine.rootObjects().first())/*父視窗*/);//設定其父視窗
//顯示
w.show();
//設定位置
w.move(20,30);
//w.show();
return a.exec();
}
QML MainQml.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
//import ABC 1.0
import QtQuick.Dialogs 1.1
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
Window{
id:qmlWindow
title: "WINDOW"
width: 1000
height: 800
visible: true
Text {
id: name
text: qsTr("THIS IS QML")
}
}
Qwidget 我就直接這樣了
實作效果如圖
還有一種就是QML 嵌入QWidget
直接
就完事了,然後設定需要讀取的檔案
這個好像是不能貼Window 控件的