kizumi_header_banner_img

Learn. Build. Share.

加载中

文章导读

基于脚手架微服务的视频点播系统-界面布局部分(一)_首页及播放界面布局


avatar
xiu114514 2025年9月10日 54
基于脚手架微服务的视频点播系统-界面布局部分(一)_首页及播放界面布局

@TOC 本项目客户端使用Qt6.7.3+cmake进行搭建,需要在项目开始时选择git同步项目,具体环境如下图: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

没显示的就是不需要勾选的。项目创建时选择编译器为minGw11.2.0 64-bit,debug等一共五种模式全部勾选上。 需要跟随文章进行项目推进的话推荐与文章环境一致。相比于我们之前所实现的仿QQ音乐播放器,这个项目难度要比前者大的多。而且前项目qt5中与qt6中的使用过的函数如果功能没有发生太大变化,我们会省略的去介绍这些功能。希望读者最好是将音乐播放器的项目做完之后再来学习本项目。 同样的与上一个项目相同,因为文章描述不便,所以我们实现时如果是界面ui摆放,qss美化等工作,只给出当前步骤做完之后的示例图以及控件的嵌套关系。如若需要布局尺寸qss样式代码以及图片资源,可以参考本项目的最后一篇文章中提供的源码连接。下面我们正式开始本项目的学习。 本文章结束时最终实现的首页布局与播放界面布局如下: 在这里插入图片描述 播放界面布局如下: 在这里插入图片描述 全屏之后的效果如下: 在这里插入图片描述

一.仓库搭建

因为本项目我们需要实现服务端与客户端,代码量比较大,所以我们先在gitee上创建一个仓库,同时为该仓库创建两个保护分支,一个master分支,一个develop分支。然后使用git将远端仓库拉到我们自己项目代码的文件夹后执行下面操作:

二.项目构建

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

三.启动界面

在 CMakeLists.txt 中,我们需要添加如下指令:

此命令的作用是确保 MOC(元对象编译器)在查找头文件时,除了默认的系统路径外,还会在工程源文件目录中进行搜索。 有人可能会提出疑问:在 Linux 环境下使用 g++ 编译 C++ 代码时,编译器本身会自动在当前目录中查找头文件,为何此处仍需显式指定?原因在于 Qt 采用了元对象系统(Meta-Object System)实现其特有的编程范式。诸如 signals、slots 等关键字并非标准 C++ 语法,因此 Qt 引入了 MOC 这一预处理器,其作用是在常规编译之前将 Qt 特有的语法扩展转换为标准的 C++ 代码。 上述包含路径的显式添加,正是为了指导 MOC 编译器在预处理阶段能够正确定位到工程目录中的相关头文件,从而完成元对象代码的生成工作。

因为我们最后视频播放器需要从远端拉取数据,所以我们需要设置一个启动页面来让我们的资源拉取完毕之后再展示主界面,具体效果如图,很简单: 在这里插入图片描述 其实就是一个QWidget与一个QLabel的组合,这部分我们给出具体的实现方法: 界⾯内部只有⼀个QLabel显⽰logo。具体如下: ① 界⾯为模态对话框,没有标题栏,并且窗⼝图标也不会在任务栏显⽰ ② 界⾯尺⼨:⻓1450,宽860,背景⾊为纯⽩⾊#FFFFFF ③ 创建⼀个QLabel⽤来显⽰Logo,QLabel在界⾯中的位置:(524, 374) 然后我们需要设置让其两秒之后消失然后显示主窗口,实现方法如下:

因为qt6.5之后如果我们不在main函数中设置时,它的默认窗口颜色会跟随系统浅色或深色主题进行设置,以及窗口大小会跟随屏幕分辨率进行变化,我们本项目不需要这两个属性,所以我们在main函数中设置下:

四.主界面布局

4.1主界面外观布局实现

仔细观察发现: a. 主窗⼝没有标题栏 b. 程序运⾏时在任务栏有特定图标 c. 窗⼝的边沿有点模糊⿊⾊阴影效果 上述特征在窗⼝显⽰出来已经存在来,所以在主界⾯创建时,应该完成上述需求。再仔细观察主界面我们可以得到主界面一共分为三个部分,head,bodyleft及bodyRight。所以我们可以这样布局: 在这里插入图片描述 控件嵌套关系如下: 在这里插入图片描述 接下来当然是实现界面阴影效果了,还是像之前一样,我们把初始化ui界面的逻辑和连接信号槽的所有逻辑统一放到两个函数中并在构造函数中调用,实现逻辑如下:

当然去掉边框后窗口无法再移动,我们也需要手动处理下:

4.2主界面功能逻辑实现

4.2.1minBtn和quitBtn添加槽函数

minBtn和quitBtn的作⽤是最⼩化和关闭窗⼝,这两个功能⽗类已经实现,所以给按钮绑定 QPushButton::clicked信号时,槽函数直接使⽤⽗类QWdiget的即可。上面的connect中我们已经连接相关信号槽。

4.2.2点击bodyLeft中的按钮实现页面切换

我们新建造一个自定义普通类为PageSwitchButton,后面将侧边栏的三个按钮提升上来即可:

注意到上面有一个LOG(),这是我们封装的一个简单的日志,我们新建一个头文件名为util.h,以后我们写的所有的小工具都放到这个头文件中,日志封装代码如下:

五.首页布局

5.1首页外观布局

当点击布⾸⻚按钮后,会切换到⾸⻚界⾯。 仔细观察⾸⻚布局会发现: ① ⾸⻚整体可分成上下两部分组成:选择部分和视频信息显⽰部分。 ② 选择搜索区域可分成左右两部分组成:分类和标签区域 和 搜索区域 ③ 分类标签区域可分为上下两部分组成:分类区域 和 标签区域 ④ 搜索区中的编辑器实际为⼀个⾃定义控件,QT内置的QLineEdit⽆法达到上述效果 所以我们可以新建一个设计师类名为HomePageWidget,然后在homepagewidget.ui中完成⾸⻚布局。 最终效果如下: 在这里插入图片描述 搜索框的qss美化代码如下:

界面控件嵌套关系如下: 在这里插入图片描述

5.2首页逻辑处理

5.2.1标签与分类按钮处理

⽤⼾可以通过点击标签或分类来筛选感兴趣的视频,因此标签和分类都是按钮,并且按钮上⽂本和⽂ 本颜⾊可能不同,将来定义⼀个buildSelectBtn函数专⻔⽤来创建按钮。 由于每个分类下显⽰的标签内容是不⼀样的,点击分类后,标签位置显⽰对应该分类的标签,因此分 类和标签之间必须要有对应关系。 封装buildSelectBtn函数单独创建按钮,创建按钮时需要传递按钮的⽂本、颜⾊和⽗元素。 分类和标签创建时,先创建分类和标签按钮,分类和标签按钮⽆需绑定槽函数,具体的分类项和标签 项按钮在创建好之后,需要绑定槽函数。

那么当我们点击分类中的按钮时,下面的标签栏会自动切换,当标签栏中的按钮被点击后,视频列表区域的视频会进行切换。因为后者需要服务端的支持才能继续,所以我们这里先实现前者:

5.2.2刷新与置顶按钮处理

我们发现在视频播放界面中的左下角有这样两个按钮: 在这里插入图片描述 他们的作用相信各位都已心知肚明,我们不再赘述。因为这两个功能也需要服务端提供支持才能实现,所以我们这里暂时搁置,只将按钮和对应槽函数给实现出来:

5.2.3视频信息框的实现

VideoBox整体为上下结构,由视频封⾯区、视频标题区、⽤⼾信息区组成;视频封⾯区⼜内嵌:播放 量、点赞和视频时⻓;⽤⼾信息区分为:⽤⼾头像、⽤⼾昵称、视频上传时间、删除按钮组成。所以我们添加⼀个设计师界⾯,命名为VideoBox,在VideoBox.ui界面中进行布局: 在这里插入图片描述 控件嵌套关系如下: 在这里插入图片描述 然后我们更新16个这样的box到首页:

5.2.4视频搜索框的实现

因为我们的搜索框中带有按钮,所以我们这里需要自定义搜索框,因为比较简单,这里我们直接新建一个c++类的头文件与cpp文件即可,自定义实现如下:

之后在首页对search进行类型提升即可。 到这里就可以看到我们最开始给出的首页样式图片了。

六.视频播放页布局

6.1视频播放页外观布局

当点击VideoBox的视频封⾯或视频标题后,表明要播放该视频,此时需要弹出视频播放窗⼝播放该视 频。此部分布局比较复杂,因为这里我们需要实现最大化效果,所以我们需要通过布局器去控制大部分控件的高度与宽度,所以很少写死某些控件的宽高。实现的时候最好耐心一些,实在比较难可以参考本项目最后一篇文章发布时给出的源码,布局完毕后的界面如下: 在这里插入图片描述 界面中控件的嵌套关系如下: 在这里插入图片描述 在这里插入图片描述

6.2视频播放页的逻辑及相关控件逻辑实现

6.2.1点击首页中的videoBox弹出视频播放界面

当点击⾸⻚中VideoBox的视频封⾯或标题时,应该弹出播放界⾯播放视频,因此VideoBox必须持有 PlayerPage⻚的对对象。在拦截的⿏标在视频封⾯和标题上点击的事件处理中,显⽰播放⻚⾯。

6.2.2设置模态对话框&最⼩化&最大化&切换显示/隐藏视频信息和关闭

6.2.3设置定时隐藏标题栏和播放控制区域

当我们的鼠标放在播放界面一段时间之后,视频的播放控制区域和标题栏会自动消失,我们这里也来实现一下,当鼠标在screen的Widget内移动时,显示二者,静止超过十秒后二者淡出,如果鼠标放在播放控制区域时,保持二者的显示(因为此时可能需要进行输入弹幕,音量调节或倍速切换等操作):

6.2.4进度条以及seek功能实现

这个部分在音乐播放器部分我们实现的已经很熟悉了,这里便不再赘述,新建一个设计师类名为PlaySlider,然后在ui界面中进行布局,最终效果如下: 在这里插入图片描述

控件嵌套关系如下: 在这里插入图片描述 seek功能逻辑实现如下:

然后在PlayerPage页面提升videoSilder为该类即可有进度条效果。这里有些美中不足的是,当进度条静止不动时,最大化页面后进度条长度跟最大化之前一样没有发生变化。应该通过等比例进行放大的,但是不知道为什么放大时有问题尺寸始终不对,不过因为后面进度条是跟着视频播放进度走的,会以播放进度百分比修改长度,所以这个问题只会出现在暂停播放同时缩小或放大窗口时才会出现,不影响大体体验,这个问题有余力的读者可以自行进行解决下,这里我们不再解决。

6.2.5音量调节按钮的实现

跟之前音乐播放器一样,我们新建一个设计师类名为Volume,然后在其ui界面中进行布局,布局完成之后的最终结果如下: 在这里插入图片描述 控件嵌套关系如下: 在这里插入图片描述 然后我们为此控件实现拖拽功能:

当然,我们也需要在播放界面添加对应槽函数让其点击之后会显示该弹窗:

6.2.6倍速播放窗口的实现

在这里插入图片描述 倍数播放窗⼝和⾳量调节窗⼝类似,都是弹出窗⼝。倍数播放窗⼝实际上内部只包含4个QPushButton的按钮即可,添加⼀个设计师界⾯,命名为PlaySpeed,在该类的ui界面中进行布局,最终效果如上,控件布局如下:

在这里插入图片描述 其类中我们给他添加外观属性以及连接相应槽函数:

当然我们也需要在播放界面对倍速切换按钮进行点击时能够弹出该自定义的控件:

6.2.7弹幕编辑框实现

Qt内置的QLineEdit⽆法达到预期效果,因此弹幕编辑框也需要⾃定义。弹幕编辑框的布局也⽐较简 单,实际就是在编辑框右侧放置⼀个按钮,将编辑框、按钮以及⽂本的样式设置好即可。 添加⼀个.h和.cpp⽂件,类命名为BarrageEdit,在该类中完成弹幕编辑框的实现:

接下来在playerpage页面将弹幕编辑框提升为上面的类即可有下面的效果: 在这里插入图片描述

 



评论(已关闭)

评论已关闭

日历

2025 年 9 月
 1
2345678
9101112131415
16171819202122
23242526272829
3031