众所周知 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播放器的嵌入了
效果
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 控件的