方法一:IDE编译
启动Qt时,要从脚本启动qtcreator(./Qt5.12.12/Tools/QtCreator/bin/qtcreator.sh ),这样才能启动设置的环境变量source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi,在Qt里面才能选择套件编译
方法二:命令行编译
每打开一个终端,执行source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi,设置环境变量,这样才能识别到qmake,然后生成makefile,再点击make生成exe
tftp在linux系统未启动的uboot阶段使用,方便不安全麻烦
scp基于SSH,在linux系统启动后就有了,安全方便,代替tftp
解决:编译套件选择X86下面的,不要选择I.MX6ULL的套件
一个从零开始的嵌入式Qt开发项目,记录了那些让我熬夜排查的Bug和解决方案
1. QStackedWidget 可以不用索引切换页面
现象:用 QStackedWidget 管理多个页面,传统方式是用 setCurrentIndex(0),但索引容易乱,维护困难。
更好的做法:直接传界面指针切换。
// ❌ 不推荐
ui->stackedWidget->setCurrentIndex(1);
// ✅ 推荐:直接用界面指针
ui->stackedWidget->setCurrentWidget(ui->page_music);
5. 定时器里清除列表会打断当前播放
现象:使用定时器定时刷新音乐列表,结果每次刷新时正在播放的音乐突然中断。
原因:清空 QListWidget 或 QMediaPlaylist 时,如果当前有歌曲在播放,播放器会失去当前播放项。
解决:刷新列表前先保存当前播放状态,刷新完成后恢复。
void refreshPlaylist() {
// 保存当前播放索引
int currentIndex = m_playlist->currentIndex();
bool wasPlaying = (m_player->state() == QMediaPlayer::PlayingState);
// 清空并重新加载列表
ui->listWidget->clear();
m_playlist->clear();
// ... 重新扫描文件 ...
// 恢复播放状态
if (currentIndex >= 0 && currentIndex < m_playlist->mediaCount()) {
m_playlist->setCurrentIndex(currentIndex);
if (wasPlaying) {
m_player->play();
}
}
}
6. connect 写在主窗口,实现界面解耦
原则:独立的界面类之间互相不引用,不知道对方的存在。通过信号槽实现通信。
架构:
- 子界面定义信号(需要通知外界的事情)
- 子界面定义槽函数(接收外界的指令)
- 主窗口负责
connect,连接发送者和接收者
// searchmusic.h - 搜索窗口
class SearchMusic : public QWidget {
signals:
void songDownloaded(const QString &filePath); // 通知外界
};
// musicplayer.h - 播放窗口
class MusicPlayer : public QWidget {
private slots:
void onSongDownloaded(const QString &filePath); // 接收通知
};
// terminal.cpp - 主窗口实现连接
connect(m_searchWindow, &SearchMusic::songDownloaded,
&MusicPlayer, &MusicPlayer::onSongDownloaded);
8. 中文歌曲名匹配失败,实际是下载文件大小为 0
现象:搜索中文歌曲名能正常显示结果,但下载后文件大小为 0,播放失败。
排查过程:
HTTP status code: 302
Content-Length header: 0
Downloaded file size: 0 bytes
Download succeeded but file is empty, removing...

