当前位置: 首页 > 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.zskr.cn/news/1473374.html

相关文章:

  • MATLAB一键实现正态信息扩散与核密度拟合(含可视化与参数调节)
  • 硬件测试工程师:从“打杂”到专业“找茬人”的核心能力与实战指南
  • 2026年6月郴州贵金属奢侈品回收指南:郴奢汇万宝店领衔,正规机构推荐清单 - 小仙贝贝
  • 讲真的2026年淄博保险纠纷律师推荐 5位实战经验丰富 - 本地品牌推荐
  • 掌握池化的原理
  • Matlab图像去噪效果量化评估工具:PSNR/SSIM/RMSE一键计算脚本合集
  • LabVIEW串口调试助手开发:从数据流原理到工程实践
  • 机器学习第4周:猴痘病识别
  • 深度解析FOC轮腿机器人:从零构建智能平衡机器人的完整攻略
  • 8D报告怎么写
  • MATLAB版LDPC码实战包:从随机H矩阵生成到LLR-BP译码及BER曲线绘制
  • 终极键盘连击解决方案:免费开源工具KeyboardChatterBlocker完整指南
  • 上市智慧食堂厂家盘点:从资质到落地的客观对比 - 互联网科技品牌测评
  • C/C++混合编程:extern “C“解决链接错误与符号管理
  • LinkSwift网盘直链下载助手:告别限速,实现高速下载自由的终极指南
  • 3个颠覆性功能:Obsidian Excel插件如何重塑你的笔记数据管理
  • 嵌入式多任务文件系统:FatFS在FreeRTOS中的任务化移植与实现
  • 物联网操作系统技术讲座深度解析:从理论到实战的竞赛赋能
  • c#中动态数组的方法
  • 四轴飞行器PID控制进阶:从单环到串级PID的实战调参指南
  • 抖音视频批量下载终极指南:5分钟掌握高效无水印下载技巧
  • 2026 扬州卫生间厨房阳台地下室漏水维修商家测评,多家防水企业综合评分横向对比,帮本地业主甄选靠谱堵漏维保团队 - 吉修匠
  • 性价比高的济南市驾校哪个靠谱 - GrowthUME
  • 第3章:时间管理与法律红线——别让副业拖垮你
  • 技能改造方法skill-refactor
  • 方达炬 宣介写书计划:《人的财报竞争》
  • 高效解决LLM训练数据标注难题:LabelLLM开源数据标注平台实战指南
  • 色彩还原精准UV平板打印机主流品牌盘点 排行不分先后 - 奔跑123
  • 紧急通知!CSDN非IT行业AI营销绿色通道将于Q3关闭(附最后30天极速开通SOP)
  • FPGA实现AMI与CMI码编码器:VHDL设计详解与实战