Qt+FFmpeg开发视频播放器笔记(二):界面UI搭建

效果图

主要使用无边框窗体搭建,实现窗体的拖动和缩放,播放列表、文件打开等。

主要代码

manwindow设计类

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QMutex>
#include "framelesshelper.h"QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_m_closeBtn_clicked();void on_m_maxBtn_clicked();void on_m_minBtn_clicked();void on_m_listBtn_clicked();void on_m_openBtn_clicked();private:void InitUI();void InitSlots();void framelesshelperInit();private:Ui::MainWindow *ui;bool isListHid  = true;QMap<QString,QString> m_playMap ;QMutex m_mapMutex;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowFlags(Qt::FramelessWindowHint);// 适用调色板设置背景色QPalette palette(this->palette());palette.setColor(QPalette::Window, Qt::gray);   //设置背景黑色this->setPalette(palette);this->setMouseTracking(true);// 设置鼠标跟踪,不然只会在鼠标按下时才会触发鼠标移动事件InitUI();framelesshelperInit();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::InitUI()
{ui->m_menuBtn->setToolTip("logo");ui->m_menuBtn->setAutoRaise(true);ui->m_menuBtn->setIcon(QPixmap(":/images/btn_logo.png"));ui->m_closeBtn->setToolTip("关闭");ui->m_closeBtn->setAutoRaise(true);ui->m_closeBtn->setIcon(QPixmap(":/images/btn_close.png"));ui->m_minBtn->setToolTip("最小化");ui->m_minBtn->setAutoRaise(true);ui->m_minBtn->setIcon(QPixmap(":/images/btn_minus.png"));ui->m_maxBtn->setToolTip("最大化");ui->m_maxBtn->setAutoRaise(true);ui->m_maxBtn->setIcon(QPixmap(":/images/btn_normal.png"));ui->m_openBtn->setToolTip("打开");ui->m_openBtn->setAutoRaise(true);ui->m_openBtn->setIcon(QPixmap(":/images/btn_open.png"));ui->m_preBtn->setToolTip("上一个");ui->m_preBtn->setAutoRaise(true);ui->m_preBtn->setIcon(QPixmap(":/images/btn_back.png"));ui->m_playBtn->setToolTip("播放");ui->m_playBtn->setAutoRaise(true);ui->m_playBtn->setIcon(QPixmap(":/images/btn_play.png"));ui->m_nextBtn->setToolTip("下一个");ui->m_nextBtn->setAutoRaise(true);ui->m_nextBtn->setIcon(QPixmap(":/images/btn_next.png"));ui->m_setBtn->setToolTip("设置");ui->m_setBtn->setAutoRaise(true);ui->m_setBtn->setIcon(QPixmap(":/images/btn_set.png"));ui->m_listBtn->setToolTip("列表");ui->m_listBtn->setAutoRaise(true);ui->m_listBtn->setIcon(QPixmap(":/images/btn_list.png"));ui->m_volumeBtn->setToolTip("声音");ui->m_volumeBtn->setAutoRaise(true);ui->m_volumeBtn->setIcon(QPixmap(":/images/btn_voice.png"));ui->tableWidget->setStyleSheet("QTableWidget { background-color: gray; } QTableWidget::item:selected {background-color:  gray;}\QTableWidget::item:selected:active {background-color: gray;}");//ui->tableWidget->horizontalHeader()->hide();ui->tableWidget->setShowGrid(false);ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection); //被选中后不高亮//ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);ui->tableWidget->horizontalHeader()->setFont(QFont("Arial", 13));// 设置表头不显示网格ui->tableWidget->horizontalHeader()->setSectionHidden(0,true);ui->tableWidget->verticalHeader()->setSectionHidden(0,true);ui->tableWidget->horizontalHeader()->setSectionsClickable(false);//水平表头不可点击ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section {background-color:gray;border: none;} QHeaderView::section { color: blue; }");ui->tableWidget->verticalHeader()->hide();ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //选中整行.ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //单行模式.ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);ui->tableWidget->setFocusPolicy(Qt::NoFocus); //设置item选中后去掉虚线边框.ui->tableWidget->setAcceptDrops(true); //启用拖放事件.ui->tableWidget->setColumnCount(1);// 也可以设置表头标签,如果你不需要可以省略这一步QStringList headers;headers << "播放列表";ui->tableWidget->setHorizontalHeaderLabels(headers);ui->tableWidget->setRowCount(16); // 假设你想要5行ui->tableWidget->setColumnWidth(0,220);
}void MainWindow::InitSlots()
{}void MainWindow::on_m_closeBtn_clicked()
{close();
}void MainWindow::on_m_maxBtn_clicked()
{showMaximized();
}void MainWindow::on_m_minBtn_clicked()
{showMinimized();
}void MainWindow::framelesshelperInit()
{//this指的是要处理的窗体FramelessHelper *pHelper = new FramelessHelper(this);pHelper->activateOn(this);  //激活当前窗体pHelper->setWidgetMovable(true);  //设置窗体可移动pHelper->setWidgetResizable(true);  //设置窗体可缩放pHelper->setRubberBandOnMove(false);  //设置橡皮筋效果-可移动pHelper->setRubberBandOnResize(true);  //设置橡皮筋效果-可缩放
}void MainWindow::on_m_listBtn_clicked()
{if(isListHid){ui->tableWidget->hide();isListHid = false;}else{ui->tableWidget->show();isListHid = true;}
}void MainWindow::on_m_openBtn_clicked()
{QString strName = QFileDialog::getOpenFileName(this, "选择播放视频~!", "/", "视频 (*.mp4 *.m4v *.mov *.avi *.flv);; 其它(*)");if (strName.isEmpty()){return;}QString Name=strName.split("/").last();m_mapMutex.lock();m_playMap[Name]=strName;m_mapMutex.unlock();QTableWidgetItem *newItem = new QTableWidgetItem(Name);if(m_playMap.count() == 1 ){ui->tableWidget->setItem(0,0,newItem);}else{ui->tableWidget->setItem(m_playMap.count()-1,0,newItem);}//ui->listWidget->addItem(Name);
}

midslider类 

#ifndef MIDSLIDER_H
#define MIDSLIDER_H#include <QObject>
#include <QSlider>
#include <QWidget>
#include <QMouseEvent>class MidSlider : public QSlider
{Q_OBJECT
public:MidSlider(QWidget *parent = 0);~MidSlider();protected:void mousePressEvent(QMouseEvent *ev);//鼠标按下事件private:void initData();};#endif // MIDSLIDER_H
#include "midslider.h"MidSlider::MidSlider(QWidget *parent):QSlider(parent) {initData();
}MidSlider::~MidSlider()
{}//鼠标按下事件
void MidSlider::mousePressEvent(QMouseEvent *ev)
{double pos = (double)ev->pos().x() / (double)width();//当前鼠标位置比率setValue(pos*this->maximum());//设置位置QSlider::mousePressEvent(ev);
}void MidSlider::initData()
{setOrientation(Qt::Horizontal);//setFixedHeight(15);this->setStyleSheet("QSlider{background-color: transparent;}""QSlider::groove:horizontal {border: 0px solid #09A1FF;\background: #09A1FF;\height: 3px;\border-radius: 6px;\padding-left:0px;\padding-right:0px;\left:1px;right:0px;\}""QSlider::sub-page:horizontal {\background: #09A1FF;\border: 1px solid #09A1FF;\height: 3px;\border-radius: 3px;\}""QSlider::add-page:horizontal {\background: #696969;\border: 0px solid #696969;\height: 3px;\border-radius: 3px;\}""QSlider::handle:horizontal {\background:#FFFFFF;\width: 12px;height 12px;\margin-top: -5px;\margin-bottom: -5px;\border-radius: 6px;\}");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409242.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络】传输层协议——TCP协议(进阶)

目录 1.TCP连接的11种状态 2.再次理解三次挥手 2.1.再次理解三次握手 2.2.Socket编程和三次握手的关系 2.2.1.listen的参数 2.2.2.accept函数 2.3.TCP三次握手的优点 2.3.1.阻止重复历史连接的初始化 2.3.2.为什么两次握手不能防止旧的重复连接初始化造成混乱呢&am…

【附源码】Python :PYQT界面点击按钮随机变色

系列文章目录 Python 界面学习&#xff1a;PYQT界面点击按钮随机变色 文章目录 系列文章目录一、项目需求二、源代码三、代码分析3.1 导入模块&#xff1a;3.2 定义App类&#xff1a;3.3 构造函数&#xff1a;3.4 初始化用户界面&#xff1a;3.5 设置窗口属性&#xff1a;3.6 …

基于YOLOv7算法的高精度实时课堂场景下人脸检测系统

项目目标 开发一套基于YOLOv7的高精度实时人脸检测系统&#xff0c;适用于课堂场景。实现对图片、视频、文件夹内的图像及摄像头流的实时人脸检测。提供直观的图形界面&#xff0c;方便用户操作。支持模型权重的灵活选择与加载&#xff0c;以及后处理参数的调整。 主要功能 模…

基础算法--递推算法[信奥一本通]

本节所讲题源自【信奥一本通】C版&#xff1a;基础算法-第三章-递推算法 相信大家应该都接触过数列的概念。哎哟&#xff0c;一直在跟数组打交道&#xff0c;说数列感觉好陌生&#xff0c;哈哈。数列中的迭代法大家都还记得吗&#xff1a;通过反复应用特定规则&#xff0c;推导…

海思SD3403/SS928V100开发(16)Tsensor驱动开发

1. 前言 由于需要检测SD3403芯片内部实时温度,需要开发Tsensor传感器驱动和应用 查看手册发现SD3403内部有三个Tsensor传感器 可以参考之前我写的35系列平台Tsensor驱动开发记录 海思35系列平台Tsensor驱动开发(1)驱动编写_t sensor-CSDN博客 海思35系列平台Tsensor驱动…

MyBatis源码(6)拦截器

1、目标 本文的主要目标是学习MyBatis拦截器的源码&#xff0c;本文将以插入操作为例debug拦截器相关的源码 2、拦截器源码分析 调用mapper接口的insert插入记录方法&#xff0c;会调用SqlSession对象的insert方法 SqlSession执行insert方法 Spring容器会创建SqlSessionTemp…

【Algorithm】三步问题

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1.三步问题1.题目连接2.算法原理讲解&&代码实现 2.最小花费爬楼梯1.题目连接2.算法原理讲解&&代码实现 3.解码方法1.题目连接2.算法原理讲解&&代码实现 1.三步问题 1.题目连…

如何在分布式环境中实现高可靠性分布式锁

目录 一、简单了解分布式锁 &#xff08;一&#xff09;分布式锁&#xff1a;应对分布式环境的同步挑战 &#xff08;二&#xff09;分布式锁的实现方式 &#xff08;三&#xff09;分布式锁的使用场景 &#xff08;四&#xff09;分布式锁需满足的特点 二、Redis 实现分…

1/f噪声影响及解决措施

在将6位半数字万用表输入短接时&#xff0c;观察其输出。在逐渐增加均值次数后&#xff0c;噪声开始下降&#xff0c;达到一定程度后便停止下降&#xff0c;随着时间的推移&#xff0c;停止下降的噪声在逐渐增加&#xff0c;该部分主要是1/f噪声影响。 这种1/f噪声&#xff08;…

404错误页面简约清新源码 非常好看

源码介绍 404错误页面简约清新源码 非常好看&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 源码下载 404错误页面简约清…

摄像头实时检查程序,插入设备,自动显示画面,支持多个摄像头,支持拍照,照片放大缩小

支持的特性 插入摄像头设备后&#xff0c;无需手动选择&#xff0c;自动显示摄像头画面&#xff0c;需要预先授权支持多个摄像头切换显示多个摄像头时支持 默认显示特定名称的摄像头支持拍照支持照片放大&#xff0c;缩小 显示效果 完整代码 <!DOCTYPE html> <html…

Spring Boot 有哪些优点?

Spring Boot 有哪些优点&#xff1f; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Spring Boot以其简洁和高效的特点&#xff0c;革新了Java应用的开发和部署方式。以下是其几大核心优势&#xff0c;让你一目了然&#xff1a; 减少时间成…

【舞动生命,营养护航】亨廷顿舞蹈症患者的维生素补给站

Hey小伙伴们~&#x1f44b; 在这个充满色彩的世界里&#xff0c;每个人都在以自己的方式绽放光彩。但你知道吗&#xff1f;有一群特别的朋友&#xff0c;他们面对着亨廷顿舞蹈症的挑战&#xff0c;却依然以不屈不挠的精神舞动着生命的旋律。&#x1f483;✨ 今天&#xff0c;就…

Windows下线程的竞争与资源保护(win32-API)

一、前言 在线程编程中&#xff0c;资源共享与保护是一个核心议题&#xff0c;尤其当多个线程试图同时访问同一份资源时&#xff0c;如果不采取适当的措施&#xff0c;就会引发一系列的问题&#xff0c;如数据不一致、竞态条件、死锁等。为了确保数据的一致性和线程安全&#…

数据结构(树、平衡树、红黑树)

目录 树 树的遍历方式 平衡二叉树 旋转机制 左旋 右旋 旋转实例 左左 左右 右右 右左 总结 红黑树 树 相关概念 节点的内部结构如下 二叉树与二叉查找树的定义如下 树的遍历方式 前序遍历&#xff1a;当前节点&#xff0c;左子节点&#xff0c;右子结点 中序遍…

Excel的使用总结1

目录 1、汇总公式&#xff1a;TEXTJOIN 2、excel中选择某个区域的方法 3、excel中如何在复制的时候&#xff0c;不将公式一起复制过去 4、想要自动填充某个区域的值的方法 1、汇总公式&#xff1a;TEXTJOIN TEXTJOIN 函数 - Microsoft 支持 例&#xff1a;TEXTJOIN("…

25 配置交换机网关

配置交换机网关 一、配置交换机默认网关 配置管理网关&#xff1a; Switch(config)#ip default-gateway 192.168.1.254二、配置交换机管理IP及默认网关练习 Route0&#xff1a; # 进入特权模式 Router>enable# 进入全局配置模式 Router#configure terminal # 进入f0/0口…

了解prolog规则

要推理先要有规则&#xff1b; 假设有一条规则&#xff0c; 如果X和Y是朋友&#xff0c;那么Y和X也是朋友&#xff1b; 这条规则写成这样&#xff0c; friend(X,Y) :- friend(Y, X). X和Y都是大写&#xff0c;表示这是两个变量&#xff1b;符号 :- 表示推理关系&…

【计算机网络】mini HTTP服务器框架与代码

注注注&#xff1a;本篇博文都是代码实现细节&#xff0c;但不会进行演示&#xff0c;演示看孪生篇 另外&#xff0c;由于tcp套接字部分本质都是套路&#xff0c;所以就不再进行赘述。 目录 1 请求反序列化2 读取url文件内容3 构建响应 1 请求反序列化 我们肯定会先收到请求&…

搜狐新闻HarmonyOS Push开发实践

本文字数&#xff1a;1795字 预计阅读时间&#xff1a;15分钟 01 背景 搜狐新闻作为HarmonyOS的合作伙伴&#xff0c;于2023年12月成功上架鸿蒙单框架应用市场&#xff0c;成为首批鸿蒙应用矩阵的一员。 推送作为新闻类应用的重要组成部分&#xff0c;我们将其纳入到二期功能开…