当前位置: 首页 > news >正文

IMX6ULL_主界面

IMX6ULL_主界面

  • 新建项目
  • 添加图片
  • 设计UI界面
  • 代码编写
    • 音乐播放器移植
    • GPS移植

这里我是把前面项目的所有功能,融合到一个QT文件中

新建项目


添加图片

项目文件夹(右键) - > 添加新文件 -> Qt的Qt Resoure File -> 名字res -> 确认后 -> 添加前缀 -> 添加文件

设计UI界面

通过样式表来修改组件

代码编写

音乐播放器移植

a、添加之前编写的文件
将这些文件复制粘贴,然后

在到软件中,添加现有文件(Add Existing Directory)。还需要添加其他子项目文件,我这里只是以音频播放器为模板

(需要注意.pro文件添加的SOURCES += 和 HEADERS += 以及 FORMS += 有没有缺失或者重复导入)

b、添加类

QT+=core gui network \ xml \ multimedia \ multimediawidgets \ widgets \ sql \ serialport

c、移植步骤
1、将Audio.c连接音频相关的信号与槽放到一个工作函数中,这样主窗口可以通过发出启动信号时,调用执行该函数,以便显示音乐播放器UI

// 这些是要添加的槽函数以及信号和按钮public:voidaudio_working();// 连接音频相关的信号与槽voidclearConnections();// 断开所有信号与槽的连接signals:voidback();//返回信号privateslots:voidon_pushButton_clicked();// 关闭按钮点击,退出音乐界面
// 连接音乐播放器和列表相关的信号与槽voidWidget::audio_working(){// 连接播放器状态变化信号与槽connect(musicPlayer,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(mediaPlayerStateChanged(QMediaPlayer::State)));// 连接播放列表当前索引变化信号与槽connect(musicPlaylist,SIGNAL(currentIndexChanged(int)),this,SLOT(mediaPlaylistCurrentIndexChanged(int)));// 连接歌曲时长变化信号与槽connect(musicPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(musicPlayerDurationChanged(qint64)));// 连接播放位置变化信号与槽connect(musicPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(mediaPlayerPositionChanged(qint64)));// 连接元数据可用状态变化信号与槽(用于获取专辑封面)connect(musicPlayer,&QMediaPlayer::metaDataAvailableChanged,this,&Widget::onMetaDataAvailableChanged);// 连接播放位置变化信号用于更新歌词connect(musicPlayer,&QMediaPlayer::positionChanged,this,&Widget::updateLyrics);// 连接播放列表索引变化信号connect(musicPlaylist,&QMediaPlaylist::currentIndexChanged,this,&Widget::mediaPlaylistCurrentIndexChanged);// 连接歌曲列表项点击信号与槽connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(listWidgetCliked(QListWidgerItem*)));// 连接进度条释放信号与槽connect(ui->horizontalSlider,SIGNAL(sliderReleased()),this,SLOT(durationSliderReleased()));}

2、在Audio.c中创建断开播放器号与槽的连接,用于退出音乐界面时清理

// 断开所有信号与槽的连接,用于退出音乐界面时清理voidWidget::clearConnections(){// 断开音乐播放器状态改变信号的连接disconnect(musicPlayer,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(mediaPlayerStateChanged(QMediaPlayer::State)));// 断开媒体播放列表当前索引改变信号的连接disconnect(musicPlaylist,SIGNAL(currentIndexChanged(int)),this,SLOT(mediaPlaylistCurrentIndexChanged(int)));// 断开音乐播放器时长改变信号的连接disconnect(musicPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(musicPlayerDurationChanged(qint64)));// 断开音乐播放器播放位置改变信号的连接disconnect(musicPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(mediaPlayerPositionChanged(qint64)));// 断开音乐播放器元数据可用改变信号的连接disconnect(musicPlayer,&QMediaPlayer::metaDataAvailableChanged,this,&Widget::onMetaDataAvailableChanged);// 断开音乐播放器播放位置改变信号与更新歌词槽函数的连接disconnect(musicPlayer,&QMediaPlayer::positionChanged,this,&Widget::updateLyrics);// 断开媒体播放列表当前索引改变信号与另一个同名槽函数的连接(如果有重复连接情况需要注意)disconnect(musicPlaylist,&QMediaPlaylist::currentIndexChanged,this,&Widget::mediaPlaylistCurrentIndexChanged);// 断开列表部件的项目点击信号的连接disconnect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(listWidgetCliked(QListWidgetItem*)));// 断开水平滑块的滑块释放信号的连接disconnect(ui->horizontalSlider,SIGNAL(sliderReleased()),this,SLOT(durationSliderReleased()));}

3、在主窗口创建任务调度和线程执行与销毁相关的定义

//mainwindow.cpp// ==================== 创建线程对象 ====================// 为每个功能模块创建独立的线程,实现并行运行t3=newQThread;// 音频模块线程// ==================== 创建工作对象 ====================// 创建各个功能模块的实例对象audio=newWidget;// 音频模块,其他模块名字都正常,就这个不一样// ==================== 将工作对象移入线程 ====================// 使用moveToThread将对象移动到对应线程,使其在该线程的事件循环中运行audio->moveToThread(t3);// ==================== 建立启动信号连接 ====================// 当主窗口发出启动信号时,执行对应模块的工作函数connect(this,&MainWindow::audio_starting,audio,&Widget::audio_working);// ==================== 按钮点击启动模块 ====================// 音频模块按钮:发出启动信号,启动线程,显示音频界面,隐藏主窗口connect(ui->pushButton_2,&QPushButton::clicked,this,[=](){emitaudio_starting();t3->start();audio->show();this->hide();//当前界面被隐藏});// 音频模块返回:终止线程,隐藏音频界面,显示主窗口connect(this->audio,&Widget::back,[=](){t3->terminate();this->audio->hide();this->show();});
signals:voidaudio_starting();// 启动音频模块信号private:Ui::MainWindow*ui;Widget*audio;//音频模块对象QThread*t3;// 音频模块运行线程

4、在Audio.c中添加返回按键的槽函数,用于返回主界面

// 关闭按钮点击事件处理voidWidget::on_pushButton_clicked(){clearConnections();// 设置音乐播放器状态为停止状态musicPlayer->stop();// 播放/暂停按钮设置为未选中状态ui->btn_play->setChecked(false);// 重置播放列表索引为 -1musicPlaylist->setCurrentIndex(-1);// 清除列表中的当前选中项ui->listWidget->setCurrentRow(-1);// 将水平滑块设置到初始位置(值为0)ui->horizontalSlider->setValue(0);// 清空显示的播放时间等信息ui->label_3->setText("");ui->label_4->setText("");// 设置专辑封面为初始默认图片setAlbumArt(QPixmap(":/images/fengshen.jpg"));// 重置当前歌词路径为空currentLyricsPath.clear();// 清除歌词显示标签的文本内容ui->label_2->setText("");emitthis->back();}

GPS移植

http://www.jsqmd.com/news/961703/

相关文章:

  • 深圳本地黄金回收收的顶靠谱,三十年实体老店,水贝源头价高价收金 - 奢侈品回收测评
  • Figma中文界面汉化终极指南:3步实现设计工具无障碍化
  • FPGA入门:从50MHz时钟分频到1秒LED闪烁的完整设计解析
  • 掌握池化的原理
  • Altium Designer极坐标栅格实战:环形PCB布局效率提升指南
  • 讲真的2026年淄博保险纠纷律师推荐 5位实战经验丰富 - 本地品牌推荐
  • 2026年6月郴州贵金属奢侈品回收指南:郴奢汇万宝店领衔,正规机构推荐清单 - 小仙贝贝
  • MATLAB一键实现正态信息扩散与核密度拟合(含可视化与参数调节)
  • Matlab图像去噪效果量化评估工具:PSNR/SSIM/RMSE一键计算脚本合集
  • 硬件测试工程师:从“打杂”到专业“找茬人”的核心能力与实战指南
  • NLP数据扰动:提升模型鲁棒性的输入空间正则化实践
  • 【2024最新权威认证】:CSDN AI数字营销服务站内广告投放能力白皮书(含API文档截图与合同条款原文)
  • 空调维修培训机构怎么选?零基础入门必看攻略 - 湖南阳光技术
  • YOLO11/12/26/DEIM/RTDETR:选择性频率残差门控SFRG(自研独家),通过“低频看全局、高频看细节”的互补共振,把小目标成倍放大、把遮挡部分用全局语义补齐、抑背景噪声。
  • 机器学习第4周:猴痘病识别
  • AI Slop 正在吞噬互联网:当生成式泛滥成为技术社区的隐形杀手
  • BEVFormer TensorRT部署工具包:含INT8量化流程、CUDA自定义算子源码与Docker一键构建环境
  • FOC轮腿机器人:嵌入式运动控制系统的技术实现与创新
  • MuleSoft与LangChain协同架构:企业级AI中台的工程实践
  • 2026 芜湖防水补漏瓷砖空鼓修复推荐,苏易修缮本土直营,长江圩区汛期返渗皖南丘陵山泉渗水梅季高湿闷泡冬夏温差裂漏软基沉降翘砖就近微创修 - 苏易修缮
  • LabVIEW串口调试助手开发:从数据流原理到工程实践
  • Atom简体中文汉化包:为开发者打造无障碍编程体验的本地化解决方案
  • 2026 铜陵防水补漏瓷砖空鼓修复推荐,苏易修缮本土直营,长江汛期江水顶渗皖南超长梅雨矿区岩溶沉降南部丘陵山体渗水冬夏温差开裂沿江滨湖软基翘砖就近微创修 - 苏易修缮
  • 8D报告怎么写
  • 深度解析FOC轮腿机器人:从零构建智能平衡机器人的完整攻略
  • MATLAB版LDPC码实战包:从随机H矩阵生成到LLR-BP译码及BER曲线绘制
  • 电源设计实战宝典:从EMC、安规到PCB布局的工程师指南
  • 上市智慧食堂厂家盘点:从资质到落地的客观对比 - 互联网科技品牌测评
  • 高云GW1NSR-4C SoC开发环境搭建:从FPGA到ARM Cortex-M3的全流程指南
  • 别死记定义了!用‘家族辈分图’和‘公司层级’来理解哈斯图中的上下界与确界