C++调用Qt项目简易开发环境搭建(以视频播放器为例,附整个工程源码,支持win32_x64_debug_release,只需安装vs即可下载工程进行编译)

一、本文主要内容介绍:
0、先附上工程源码下载链接(资源包括qt的vs2019所有库文件,免积分):https://download.csdn.net/download/qq_39660930/85135035
1、从零开始搭建一份Qt项目开发工程,只需安装了vs即可打开工程进行编译。原理:使用C++调用Qt lib库的形式进行开发,不使用任何插件,不使用QtCreator。
2、vs配置项目教程。
3、注意点:对于C++开发者来讲,就是写cpp代码,然后进行编译,链接来生成可执行程序。而Qt只是提供了一些自动生成cpp代码的功能而已。比如使用Qt的uic.exe即可将它的.ui文件生成我们的.h文件。
4、Qt开发一个简易视频播放器,支持拖拽文件进行打开、双击全屏等功能。软件界面如下:
在这里插入图片描述
二、项目开始
1、下载vs,本文使用的是 vs2019。
2、下载vs对应的Qt lib库,包括Qt的一些应用程序(本文附带的工程源码里有,包括win32和x64的debug及release),如图:
在这里插入图片描述
3、项目框架搭建
在这里插入图片描述
BaseFunc模块提供一些编码转换函数及获取可执行程序绝对路径函数。
GuiMediaPlayer模块进行界面设计及功能实现。
MediaPlayer主函数模块负责链接库生成可执行程序。
vs2019工程配置文件夹则是vs配置工程时自动生成的,接下来详细介绍如何配置项目工程。
4、打开vs,创建新项目,选择空白解决方案:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5、创建BaseFunc工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将BaseFunc的头文件及源文件添加到工程里:
在这里插入图片描述
设置工程属性(输出目录、中间目录、配置类型、字符集、附加包含目录、预处理器):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成项目即可看到对应的lib库:
在这里插入图片描述
至此BaseFunc项目配置完成。
6、创建GuiMediaPlayer工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
拖拽头文件、源文件、资源文件到工程里:
在这里插入图片描述
这里需要注意的是:qrc和ui文件创建时只需要按照qt语法写一个最简单的就行,后面使用qt对应的程序来进行设计即可。
接下来设置工程属性(输出目录、中间目录、配置类型、字符集、附加包含目录、预处理器):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
预处理器:和BaseFunc项目一样。
Qt项目和普通的项目配置不同的地方就是要配置生成前事件,来使用Qt的exe来处理资源文件生成c++源码文件,配置如下:
在这里插入图片描述
命令行代码:

$(SolutionDir)..\openbsd\qt\lib\$(Platform)\Release\uic.exe $(SolutionDir)..\modules\$(ProjectName)\src\GuiMediaPlayer.ui -o $(SolutionDir)..\modules\$(ProjectName)\inc\ui_GuiMediaPlayer.h
$(SolutionDir)..\openbsd\qt\lib\$(Platform)\Release\moc.exe $(SolutionDir)..\modules\$(ProjectName)\inc\GuiMediaPlayer.h -o $(SolutionDir)..\modules\$(ProjectName)\src\moc_GuiMediaPlayer.cpp
$(SolutionDir)..\openbsd\qt\lib\$(platform)\Release\rcc.exe -binary $(SolutionDir)..\modules\$(ProjectName)\src\GuiMediaPlayer.qrc -o $(SolutionDir)..\modules\$(ProjectName)\src\GuiMediaPlayer.rcc

然后生成项目:
在这里插入图片描述
第一次生成项目后,需要把自动生成的源码文件添加到工程里,然后重新生成:
在这里插入图片描述
接下来配置如何编辑qrc和ui文件,右击qrc文件,选择打开方式,点击添加,选择QrcEditor.exe(Qt库文件里有),并且设置为默认值:
在这里插入图片描述
在这里插入图片描述
这样以后双击qrc文件就会自动使用QrcEditor来打开了:
在这里插入图片描述
同样右击ui文件,设置designer.exe来默认打开该文件:
在这里插入图片描述
在这里插入图片描述
这样就可以使用Qt Designer来设计我们的ui了,每次修改ui文件后,重新生成该项目即可。
至此GuiMediaPlayer项目配置完成。
7、创建主项目工程
右击解决方案,添加项目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将源文件替换为我们的main.cpp
在这里插入图片描述
右击该项目设为启动项目,并且设置依赖项目:
在这里插入图片描述
在这里插入图片描述
接下来设置工程属性(输出目录、中间目录、字符集、附加包含目录、预处理器、附加库目录)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
预处理器:和BaseFunc项目相同。
在这里插入图片描述
接下来需要设置生成后事件,程序运行时需要拷贝一些资源文件及dll到对应目录:
在这里插入图片描述
命令行代码如下:

Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Core.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Gui.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Widgets.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Multimedia.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5MultimediaWidgets.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Network.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5OpenGL.dll"  "$(TargetDir)"
mkdir "$(TargetDir)platforms\"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\plugins\platforms\qwindows.dll"  "$(TargetDir)platforms\"
XCopy /D /i /e "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\plugins\mediaservice"  "$(TargetDir)mediaservice"

Copy /D "$(Solutiondir)..\modules\GuiMediaPlayer\src\GuiMediaPlayer.rcc"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\modules\GuiMediaPlayer\src\GuiMediaPlayer.rcc"  "$(ProjectDir)"
XCopy /D /i /e "$(Solutiondir)..\modules\GuiMediaPlayer\src\ico"  "$(TargetDir)ico"
XCopy /D /i /e "$(Solutiondir)..\modules\GuiMediaPlayer\src\ico"  "$(ProjectDir)ico"

在这里插入图片描述
命令行代码如下:

Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Cored.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Guid.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Widgetsd.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Multimediad.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5MultimediaWidgetsd.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5Networkd.dll"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\Qt5OpenGLd.dll"  "$(TargetDir)"
mkdir "$(TargetDir)platforms\"
Copy /D "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\plugins\platforms\qwindowsd.dll"  "$(TargetDir)platforms\"
XCopy /D /i /e "$(Solutiondir)..\openbsd\qt\lib\$(Platform)\$(Configuration)\plugins\mediaservice"  "$(TargetDir)mediaservice"

Copy /D "$(Solutiondir)..\modules\GuiMediaPlayer\src\GuiMediaPlayer.rcc"  "$(TargetDir)"
Copy /D "$(Solutiondir)..\modules\GuiMediaPlayer\src\GuiMediaPlayer.rcc"  "$(ProjectDir)"
XCopy /D /i /e "$(Solutiondir)..\modules\GuiMediaPlayer\src\ico"  "$(TargetDir)ico"
XCopy /D /i /e "$(Solutiondir)..\modules\GuiMediaPlayer\src\ico"  "$(ProjectDir)ico"

然后生成该项目后运行即可看到界面:
在这里插入图片描述
可以看到程序没有图标,接下来进行设置:
在MediaPlayer主工程目录下放一个ico,并且创建rc文件及修改MediaPlayer.vcxproj如下:
在这里插入图片描述
生成并启动项目后可以看到图标:
在这里插入图片描述
至此项目开发环境搭建完成。
8、ui界面设计,及功能实现
开发环境搭建好以后,我们就可以双击ui文件来进行设计界面了,我们的这个界面比较简单,菜单里增加一个文件打开按钮,并且设置该按钮的ico图标为qrc里的。中央布局背景通过styleSheet来直接使用ico路径,这样我们可以在程序发布后灵活替换背景图片。
在这里插入图片描述

9、播放功能实现,代码比较简单,请直接看代码:
GuiMediaPlayer.h:

#pragma once

#include <QtCore/qthread.h>
#include <QtCore/qfile.h>
#include <QtCore/qdebug.h>
#include <QtCore/QVariant>

#include <QtGui/QMouseEvent>
#include <QtGui/QImage>

#include <QtWidgets/qmessagebox.h>
#include <QtWidgets/QPushButton>
#include <QtWidgets/qfiledialog.h>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>
#include <QtWidgets/QLabel>
#include <QtWidgets/QtWidgets>
#include <QtWidgets/qfiledialog.h>

#include <QtMultimedia/qmediaplayer.h>
#include <QtMultimedia/qmediaplaylist.h>
#include <QtMultimediaWidgets/QVideoWidget>

#include "ui_GuiMediaPlayer.h"

typedef enum enThreadState
{
	THREAD_STATE_E_Start = 0,
	THREAD_STATE_E_PrepareStop,
	THREAD_STATE_E_Stop
}THREAD_STATE_E;

class GuiMediaPlayer;
class GuiMediaPlayerThread :public QThread
{
	Q_OBJECT
public:
	GuiMediaPlayerThread(QObject* parent, GuiMediaPlayer* gui);
	~GuiMediaPlayerThread();

	void run();//线程入口函数(工作线程的主函数)

private:
	GuiMediaPlayer* m_gui;
};

class GuiMediaPlayer : public QMainWindow
{
	Q_OBJECT

public:
    static GuiMediaPlayer* instance();
    
	GuiMediaPlayer(QWidget* parent = Q_NULLPTR);
	~GuiMediaPlayer();

	THREAD_STATE_E	getThreadState() { return m_thread_state; };
	int				setThreadState(THREAD_STATE_E state) { return m_thread_state = state; };
	void			startThread();
	void			stopThread();

protected:
	//拖动进入事件
	void dragEnterEvent(QDragEnterEvent* event);

	//放下事件
	void dropEvent(QDropEvent* event);

	//关闭按钮触发
	void closeEvent(QCloseEvent* event);

	//鼠标按下
	void mousePressEvent(QMouseEvent* e);

	//鼠标移动
	void mouseMoveEvent(QMouseEvent* e);

	//鼠标释放
	void mouseReleaseEvent(QMouseEvent* e);

	//鼠标进入
	void enterEvent(QEvent* e);

	//鼠标离开
	void leaveEvent(QEvent* e);

	//窗口缩放
	void resizeEvent(QResizeEvent* event);

	//键盘按下
	void keyPressEvent(QKeyEvent* event);

	//事件捕获
	bool eventFilter(QObject* obj, QEvent* event);

private:
	void playFile(QString filename);

signals:
	void sigUpdateState();

private slots:
	void on_m_openFile_button_triggered();
	void updateState();

private:
	Ui::GuiMediaPlayerClass ui;
	THREAD_STATE_E			m_thread_state;
	GuiMediaPlayerThread*	m_thread;
	QMediaPlayer*			m_player;
	QVideoWidget*			m_playerWidget;
	int						m_twopress;
};

GuiMediaPlayer.cpp:

#include <string.h>
#include <atlconv.h>

#include "GuiMediaPlayer.h"

#include "BaseFunc.h"

GuiMediaPlayerThread::GuiMediaPlayerThread(QObject* parent, GuiMediaPlayer* gui)
	:QThread(parent)
{
	m_gui = NULL;

	if (gui == NULL)
		return;

	m_gui = gui;

	start();
}

GuiMediaPlayerThread::~GuiMediaPlayerThread()
{
}

void GuiMediaPlayerThread::run()
{
	while (1)
	{
		//程序退出时终止线程
		if (m_gui->getThreadState() == THREAD_STATE_E_PrepareStop)
		{
			m_gui->setThreadState(THREAD_STATE_E_Stop);
			return;
		}

		emit m_gui->sigUpdateState();

		QThread::msleep(1000);
	}
}

GuiMediaPlayer* GuiMediaPlayer::instance()
{
	static GuiMediaPlayer* _ins = NULL;
	if ( _ins == NULL )
	{
		_ins = new GuiMediaPlayer();
	}

	return _ins;
}

GuiMediaPlayer::GuiMediaPlayer(QWidget* parent)
	: QMainWindow(parent)
{
    char path[1024] = {0};
    char processname[1024] = {0};
    GetExecutablePath(path, processname, sizeof(path));

    QString rcc = path;
	rcc += "GuiMediaPlayer.rcc";

	QResource::registerResource(rcc);

	ui.setupUi(this);
    
    //启用控件的放下操作
	setAcceptDrops(true);

	m_player = NULL;
	m_playerWidget = NULL;

	m_twopress = 0;

	m_thread = NULL;

	connect(this, SIGNAL(sigUpdateState()), this, SLOT(updateState()));

	startThread();
}

GuiMediaPlayer::~GuiMediaPlayer()
{
	stopThread();
	if (m_player != NULL)
	{
		delete m_player;
		m_player = NULL;
	}
	if (m_playerWidget != NULL)
	{
		delete m_playerWidget;
		m_playerWidget = NULL;
	}
}

void GuiMediaPlayer::startThread()
{
	m_thread_state = THREAD_STATE_E_Start;
	m_thread = new GuiMediaPlayerThread(NULL, this);
}

void GuiMediaPlayer::stopThread()
{
	if (m_thread)
	{
		//设置准备停止状态
		m_thread_state = THREAD_STATE_E_PrepareStop;
		//一直等到停止
		while (1)
		{
			//printf("wait show img thread stop\n");
			if (m_thread_state == THREAD_STATE_E_Stop)
				break;
			QThread::msleep(100);
		}
		QThread::msleep(50);
		delete m_thread;
		m_thread = NULL;
	}
}

void GuiMediaPlayer::updateState()
{
	if (m_player)
	{
		if (m_player->mediaStatus() == QMediaPlayer::EndOfMedia)
		{
			if (m_playerWidget != NULL)
			{
				delete m_playerWidget;
				m_playerWidget = NULL;
			}

			delete m_player;
			m_player = NULL;
		}
	}
}

void GuiMediaPlayer::playFile(QString filename)
{
	if (m_playerWidget != NULL)
	{
		delete m_playerWidget;
		m_playerWidget = NULL;
	}

	if (m_player != NULL)
	{
		delete m_player;
		m_player = NULL;
	}

	m_playerWidget = new QVideoWidget;
	if (m_playerWidget == NULL)
	{
		return;
	}
	m_playerWidget->setObjectName(QString::fromUtf8("play_widget"));
	ui.verticalLayout->addWidget(m_playerWidget);
	m_playerWidget->installEventFilter(this);

	m_player = new QMediaPlayer;
	if (m_player == NULL)
	{
		return;
	}

	m_player->setVideoOutput(m_playerWidget);
	m_player->setMedia(QUrl::fromLocalFile(filename));
	m_player->play();
}

void GuiMediaPlayer::on_m_openFile_button_triggered()
{   
	QString filename = QFileDialog::getOpenFileName();
	if (filename.toStdString() == "")
		return;

	playFile(filename);

    return ;    
}

/*拖放分为拖动(Drag)和放下(Drop)两种操作。数据拖动时会被存储为MIME(Multipurpose-
 * Internet Mail Extensions)类型,在Qt使用QMimeData类来表示MIME类型数据,并还用
 * QDrag类来完成数据的转换,而整个拖放操作都是在几个鼠标事件和拖放事件中完成.
*/
void GuiMediaPlayer::dragEnterEvent(QDragEnterEvent* event)//拖动事件
{
	//可打开.txt,.h,.cpp文件
	if (event->mimeData()->hasUrls())   //数据中是否包含URL
		event->acceptProposedAction(); //如果是则接受动作
	else 
		event->ignore();
}

void GuiMediaPlayer::dropEvent(QDropEvent* event)//放下事件
{
	const QMimeData* mineData = event->mimeData();//获取MIME数据
	if (mineData->hasUrls())                     //如数据中包含URL
	{
		QList<QUrl>urlList = mineData->urls();    //获取URL列表
		if (urlList.isEmpty())
			return;
		//将其中第一个URL表示为本地文件路径
		QString filename = urlList.at(0).toLocalFile();
		if (filename.isEmpty())
			return;

		playFile(filename);
	}
}

void GuiMediaPlayer::closeEvent(QCloseEvent* event)
{
	if (1)
	{
		stopThread();
		event->accept();
	}
	else
	{
		event->ignore();
	}
}

void GuiMediaPlayer::mousePressEvent(QMouseEvent* e)
{
	QPoint lastPoint = e->globalPos();
	//printf("%d %d\n", lastPoint.x(), lastPoint.y());
}

void GuiMediaPlayer::mouseMoveEvent(QMouseEvent* e)
{
	//printf("%d %d\n", e->globalX(), e->globalY());
}

void GuiMediaPlayer::mouseReleaseEvent(QMouseEvent* e)
{
	//printf("%d %d\n", e->globalX(), e->globalY());
}

void GuiMediaPlayer::enterEvent(QEvent* e)
{
}

void GuiMediaPlayer::leaveEvent(QEvent* e)
{
}

void GuiMediaPlayer::resizeEvent(QResizeEvent* event)
{
}

void GuiMediaPlayer::keyPressEvent(QKeyEvent* event)
{
	if (event->key() == Qt::Key_Q)
	{
	}
	else if (event->key() == Qt::Key_Left)
	{
	}
	else if (event->key() == Qt::Key_Right)
	{
	}
	else if (event->key() == Qt::Key_Up)
	{
	}
	else if (event->key() == Qt::Key_Down)
	{
	}
	else if (event->key() == Qt::Key_Backspace)
	{
	}
	else if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return)
	{
	}
	else
	{
	}
}

bool GuiMediaPlayer::eventFilter(QObject* obj, QEvent* event)
{
	if (event->type() == QEvent::KeyPress)
	{
		QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
		if (keyEvent->key() == Qt::Key_Backspace)
		{
		}
	}

	if (obj == m_playerWidget)
	{
		if (event->type() == QEvent::MouseButtonDblClick)
		{
			m_twopress++;
			if (m_twopress % 2)
				m_playerWidget->setFullScreen(true);
			else
				m_playerWidget->setFullScreen(false);
		}
	}

	return QWidget::eventFilter(obj, event);
}

10、其他注意项
依赖库输入直接在main.cpp里指定的:
在这里插入图片描述
关闭打开控制台代码也在main.cpp里:
在这里插入图片描述
程序运行后如果播放视频没图像,则需要安装解码器,安装包在openbsd\qt\lib\LAVFilters-0.76.1-Installer.exe。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是用 Qt Creator 制作一个视频播放器的步骤: 1. 打开 Qt Creator,选择 "File" -> "New File or Project",在 "Choose Project" 对话框中选择 "Applications" -> "Qt Widgets Application",点击 "Choose"。 2. 在 "Create in" 对话框中选择你希望保存项目的位置,输入项目名称,点击 "Next"。 3. 在 "Class Information" 对话框中,将 "Create Main Window" 选项选中,点击 "Next"。 4. 在 "Choose Template" 对话框中选择 "Main Window",点击 "Next"。 5. 在 "Kit Selection" 对话框中选择你希望使用的 Kit,点击 "Next"。 6. 在 "Summary" 对话框中查看项目设置,点击 "Finish"。 7. 接下来,我们要添加一个视频播放器控件。在 "Design" 模式下,从 "Widget Box" 中拖拽一个 "QMediaPlayer" 和一个 "QVideoWidget" 控件到主窗口中。 8. 选中 "QVideoWidget" 控件,在 "Property Editor" 中将 "AspectRatioMode" 设置为 "IgnoreAspectRatio",以适应视频的大小。 9. 在 "Signal/Slots Editor" 中,将 "QMediaPlayer" 控件的 "mediaStatusChanged" 信号连接到一个槽函数,用于在播放视频时更新控件的状态。 10. 在 "mainwindow.cpp" 文件中,实现槽函数: ```cpp void MainWindow::on_mediaStatusChanged(QMediaPlayer::MediaStatus status) { switch (status) { case QMediaPlayer::NoMedia: ui->statusBar->showMessage("No media."); break; case QMediaPlayer::Loading: ui->statusBar->showMessage("Loading..."); break; case QMediaPlayer::Loaded: ui->statusBar->showMessage("Loaded."); break; case QMediaPlayer::Buffering: ui->statusBar->showMessage("Buffering..."); break; case QMediaPlayer::Buffered: ui->statusBar->showMessage("Buffered."); break; case QMediaPlayer::Stalled: ui->statusBar->showMessage("Stalled."); break; case QMediaPlayer::EndOfMedia: ui->statusBar->showMessage("End of media."); break; case QMediaPlayer::InvalidMedia: ui->statusBar->showMessage("Invalid media."); break; default: ui->statusBar->showMessage("Unknown status."); break; } } ``` 11. 在 "mainwindow.h" 文件中添加槽函数的声明: ```cpp private slots: void on_mediaStatusChanged(QMediaPlayer::MediaStatus status); ``` 12. 在 "mainwindow.cpp" 文件中,添加播放视频文件的代码: ```cpp void MainWindow::on_actionOpen_triggered() { QString filename = QFileDialog::getOpenFileName(this, "Open Video File", QDir::homePath(), "Video Files (*.mp4 *.avi *.wmv)"); if (!filename.isEmpty()) { ui->statusBar->showMessage(QString("Playing: %1").arg(filename)); player->setMedia(QUrl::fromLocalFile(filename)); player->setVideoOutput(ui->videoWidget); player->play(); } } ``` 13. 在 "mainwindow.h" 文件中添加 "player" 成员变量: ```cpp private: Ui::MainWindow *ui; QMediaPlayer *player; ``` 14. 在 "mainwindow.cpp" 文件的构造函数中初始化 "player": ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); player = new QMediaPlayer(this); connect(player, &QMediaPlayer::mediaStatusChanged, this, &MainWindow::on_mediaStatusChanged); } ``` 15. 最后,在 "mainwindow.ui" 文件中添加一个 "Open" 功能的菜单项,将其与 "on_actionOpen_triggered" 槽函数连接。 现在,你就可以在 Qt Creator 中运行这个视频播放器了。当你打开一个视频文件时,它就会自动开始播放。你可以使用 "QMediaPlayer" 控件提供的其他方法来控制视频的播放,如暂停、停止和调整音量等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值