Qt操控Windows Media Player
原创
©著作权归作者所有:来自51CTO博客作者贝勒里恩的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、前言
对于Windows平台,Qt有特有的模块来调用ActivityX控件
比如调用WMP,首先需要知道WMP的CLSID:{6BF52A52-394A-11D3-B153-00C04F79FAA6}
二、效果展示
三、具体步骤
1、在工程文件(.pro)中添加库
2、添加头文件
#include <QAxObject> //用于操作WMP对象
#include <QAxWidget> //用于显示WMP
3、添加WMP
axWidget = new QAxWidget;
axWidget->setControl("{6BF52A52-394A-11d3-B153-00C04F79FAA6}");
4、控制WMP
//使用dynamicCall()来调用成员函数,setProporty()来调用属性参数
axWidget->dynamicCall("URL",path);//设置组件的属性,也可利用setProperty()函数
QAxObject *controls = axWidget->querySubObject("controls");
controls->dynamicCall("stop()"); //调用成员函数
Windows Media Player ActiveX 常用的属性和方法
属性/方法名
| 说明
|
[基本属性] | |
URL:String;
| 指定媒体位置,本机或网络地址
|
uiMode:String;
| 播放器界面模式,可为Full, Mini, None, Invisible
|
playState:integer;
| 播放状态,1=停止,2=暂停,3=播放,6=正在缓冲,9=正在连接,10=准备就绪
|
enableContextMenu:Boolean;
| 启用/禁用右键菜单
|
fullScreen:boolean;
| 是否全屏显示
|
[controls] | wmp.controls //播放器基本控制
|
controls.play;
| 播放
|
controls.pause;
| 暂停
|
controls.stop;
| 停止
|
controls.currentPosition:double;
| 当前进度
|
controls.currentPositionString:string;
| 当前进度,字符串格式。如“00:23”
|
controls.fastForward;
| 快进
|
controls.fastReverse;
| 快退
|
controls.next;
| 下一曲
|
controls.previous;
| 上一曲
|
[settings] | wmp.settings
|
settings.volume:integer;
| 音量,0-100
|
settings.autoStart:Boolean;
| 是否自动播放
|
settings.mute:Boolean;
| 是否静音
|
settings.playCount:integer;
| 播放次数
|
[currentMedia] | wmp.currentMedia //当前媒体属性
|
currentMedia.duration:double;
| 媒体总长度
|
currentMedia.durationString:string;
| 媒体总长度,字符串格式。如“03:24”
|
currentMedia.getItemInfo(const string);
| 获取当前媒体信息"Title"=媒体标题,“Author”=艺术家,“Copyright”=版权信息,“Description”=媒体内容描述,“Duration”=持续时间(秒),“FileSize”=文件大小,“FileType”=文件类型,“sourceURL”=原始地址
|
currentMedia.setItemInfo(const string);
| 通过属性名设置媒体信息
|
currentMedia.name:string;
| 同 currentMedia.getItemInfo(“Title”)
|
[currentPlaylist] | wmp.currentPlaylist //当前播放列表属性
|
currentPlaylist.count:integer;
| 当前播放列表所包含媒体数
|
currentPlaylist.Item[integer];
| 获取或设置指定项目媒体信息,其子属性同wmp.currentMedia
|
我们并不知道wmp有那些参数和成员函数,对此,Qt提供了dumpdoc
命令来自动生成对应CLSID控件的说明文档:
打开编译器命令行,输入指令:dumpdoc {xxxx} -o xxx.html
四、详细代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QFileDialog>
#include <QDesktopWidget>
#include <QAxObject>
#include <QAxWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void InitUI();
QAxWidget* axWidget;
protected:
void closeEvent(QCloseEvent *event);
private slots:
void on_btn_openFile_clicked();
void on_btn_play_clicked();
void on_btn_pause_clicked();
void on_btn_stop_clicked();
void on_SoundVolumn_valueChanged(int value);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitUI();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitUI()
{
this->setWindowFlags(Qt::WindowStaysOnTopHint); //窗口始终置顶
ui->SoundVolumn->setRange(0,100);
ui->SoundVolumn->setValue(0);
axWidget = new QAxWidget;
axWidget->setControl("{6BF52A52-394A-11d3-B153-00C04F79FAA6}");
QDesktopWidget* desktop = QApplication::desktop();
axWidget->setGeometry(desktop->screenGeometry());
}
void MainWindow::closeEvent(QCloseEvent *event)
{
axWidget->close();
}
void MainWindow::on_btn_openFile_clicked()
{
QString path = QFileDialog::getOpenFileName(this,"选择要播放的文件");
axWidget->dynamicCall("URL",path);//设置组件的属性,也可利用setProperty()函数
//停止播放
QAxObject *controls = axWidget->querySubObject("controls");
controls->dynamicCall("stop()");
//音量为0
QAxObject *settings = axWidget->querySubObject("settings");
settings->dynamicCall("volume",0);
//视频信息
QAxObject *currentMedia = axWidget->querySubObject("currentMedia");
QString Title = currentMedia->dynamicCall("getItemInfo(QString)","title").toString();
QString Author = currentMedia->dynamicCall("getItemInfo(QString)","author").toString();
QString Copyright = currentMedia->dynamicCall("getItemInfo(QString)","copyright").toString();
QString Description = currentMedia->dynamicCall("getItemInfo(QString)","description").toString();
QString Duration = currentMedia->dynamicCall("getItemInfo(QString)","duration").toString();
QString FileSize = currentMedia->dynamicCall("getItemInfo(QString)","fileSize").toString();
QString FileType = currentMedia->dynamicCall("getItemInfo(QString)","fileType").toString();
QString sourceURL = currentMedia->dynamicCall("getItemInfo(QString)","sourceURL").toString();
ui->InfoShow->clear();
ui->InfoShow->append("媒体标题: " + Title);
ui->InfoShow->append("艺术家: " + Author);
ui->InfoShow->append("版权信息: " + Copyright);
ui->InfoShow->append("媒体内容描述: " + Description);
ui->InfoShow->append("持续时间(秒): " + Duration);
ui->InfoShow->append("文件大小: " + FileSize);
ui->InfoShow->append("文件类型: " + FileType);
ui->InfoShow->append("原始地址: " + sourceURL);
axWidget->show();
}
void MainWindow::on_btn_play_clicked()
{
//获取组件的子对象
QAxObject *controls = axWidget->querySubObject("controls");
//调用组件的方法
controls->dynamicCall("play()");
}
void MainWindow::on_btn_pause_clicked()
{
//获取组件的子对象
QAxObject *controls = axWidget->querySubObject("controls");
//调用组件的方法
controls->dynamicCall("pause()");
}
void MainWindow::on_btn_stop_clicked()
{
//获取组件的子对象
QAxObject *controls = axWidget->querySubObject("controls");
//调用组件的方法
controls->dynamicCall("stop()");
}
void MainWindow::on_SoundVolumn_valueChanged(int value)
{
QAxObject *settings = axWidget->querySubObject("settings");
settings->dynamicCall("volume",value);
}