ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Qt6.2实战避坑指南:Ubuntu 20.04下SerialPort与交叉编译全链路配置

Qt6.2实战避坑指南:Ubuntu 20.04下SerialPort与交叉编译全链路配置 1. 这不是“又一个Qt教程”而是一份2022年真实入职新人的Qt6实战手记2022年夏天我拎着刚领的工牌走进公司研发部工位上摆着一台预装Ubuntu 20.04的开发机——没有预装IDE没有现成环境只有一张写着“请自行配置Qt6开发环境”的便签。那天下午我花了整整六小时才让第一个QApplication窗口在屏幕上弹出来。这不是教科书里的Hello World而是真实世界里qmake报错、CMakeLists.txt里find_package(Qt6 REQUIRED COMPONENTS Widgets)反复失败、serialport模块提示unknown module、交叉编译链找不到moc路径……这些词不是搜索框里的热词是我在终端里一行行敲出来又被红色错误刷屏的真实日志。标题里那句“2022是我入职的第一年也是Qt6的飞速发展时期”背后是Qt官方在2021年12月发布6.2 LTS后整个生态在2022年剧烈重构的阵痛期Qt5项目大量迁移、文档滞后于代码、第三方库适配断层、IDE插件版本混乱。你搜到的“qt6安装教程”大多基于6.2.0或6.2.4但公司用的是6.2.3自定义patch你看到的“qt6下载”链接指向官网最新版可内网镜像源只同步到6.2.2你查到的“qt creator配置”默认启用Clang Code Model而我们项目强制要求GCC11且禁用静态分析。这不是技术选型问题是时间切片问题——你站在2022年这个特定坐标点上面对的不是抽象的“Qt6”而是一套正在动态演化的、带着补丁、依赖锁和历史包袱的工程现场。本文不讲概念不列API只复盘我从零搭建Qt6桌面应用开发环境、完成首个串口调试工具、打包发布跨平台可执行文件的全过程。所有命令、配置、报错截图文字还原、参数取舍逻辑都来自真实工单记录。适合同样卡在“qt unknown module in qt:serialport”、纠结“qt6离线安装包怎么选”、被“ubuntu-20.04安装qt交叉编译环境”折磨到凌晨三点的新人。你不需要懂C模板但得会看cmake --build的输出你不必精通QML但得知道.qrc资源文件为什么在Release模式下路径失效。现在让我们回到那个装了六遍Qt SDK的下午。2. Qt6环境搭建为什么必须放弃“一键安装”幻觉2.1 2022年Qt6安装的本质矛盾LTS版本与生态碎片化的时间差2022年Qt6的安装困境根源在于Qt公司策略性地将“稳定”与“生态成熟”拆解为两个不同步的轨道。Qt6.2是首个LTS版本官方承诺支持至2025年但其发布时2021.12配套的生态工具链尚未就绪Qt Creator 6.0.2对CMake Presets的支持存在内存泄漏PySide6 6.2.2.1在Ubuntu 20.04上与GLIBC 2.31不兼容OpenCV 4.5.5的Qt6 backend在ARM64交叉编译时缺少-DWITH_QTON的隐式依赖声明。这意味着2022年任何试图“下载最新版Qt Online Installer一键安装”的操作本质上是在赌三个变量你的Linux发行版内核版本、系统GLIBC主版本号、以及项目依赖的第三方库是否已发布Qt6适配版。我第一次安装失败就是因为在线安装器默认勾选了Qt6.2.42022.03发布而公司基础镜像的libstdc.so.6版本为20200828与Qt6.2.4要求的20210715不匹配。解决方案不是降级系统而是主动锁定Qt6.2.2——这是2022年Q1最稳定的版本其二进制包经过Ubuntu 20.04/22.04双平台验证且OpenCV 4.5.4、QSerialPort 6.2.2等关键组件均已发布对应patch。Qt官网的“Download”页面按时间倒序排列新手容易误点最新版但真实工程中版本号越大≠越稳而是越接近当前时间戳的版本越可能踩到未修复的构建脚本bug。2.2 离线安装包选择识别真正的“全功能包”而非“精简版”Qt官网提供的离线安装包命名规则极具迷惑性“Qt6.2.2-linux-x64-online.run”实为在线安装器“Qt6.2.2-6.2.2-2022-01-25-123456-linux-x64-offline.run”才是真正的离线包。但更隐蔽的陷阱在于组件勾选安装界面默认只勾选“Qt 6.2.2”主框架而Qt Serial Port、Qt Charts、Qt SVG等模块被折叠在“Additional Libraries”子菜单中且不勾选则不会下载对应源码和头文件。我曾因未勾选Qt Serial Port导致后续find_package(Qt6 REQUIRED COMPONENTS SerialPort)始终失败而错误提示却是模糊的“Could not find a package configuration file”。关键识别点有三第一离线包体积必须≥1.8GB6.2.2完整版含所有模块源码第二安装时务必展开“Additional Libraries”手动勾选Qt Serial Port、Qt SVG、Qt XML即使项目暂不用XMLQDomDocument在解析设备描述文件时仍需此模块第三绝对不要勾选“Qt Creator”——2022年Qt Creator 6.0.x与Qt6.2.x存在CMake Toolchain缓存冲突应单独下载Qt Creator 6.0.32022.04发布并配置独立toolchain路径。离线包安装后Qt6根目录下的Tools文件夹仅包含QtInstallerFramework这是故意为之Qt公司要求IDE与SDK分离部署避免版本耦合。因此正确的安装流程是先运行离线包安装Qt6 SDK路径设为/opt/Qt6.2.2再单独安装Qt Creator 6.0.3路径设为/opt/QtCreator6.0.3最后在Creator中通过“Settings Kits Qt Versions”手动添加/opt/Qt6.2.2/gcc_64/bin/qmake。2.3 Ubuntu 20.04环境初始化绕过APT源与系统库的兼容性雷区Ubuntu 20.04自带的libxcb-xinerama0版本为1.14-2而Qt6.2.2要求≥1.14.3直接apt install libxcb-xinerama0会触发依赖冲突。正确做法是跳过APT手动下载deb包安装wget http://archive.ubuntu.com/ubuntu/pool/main/libx/libxcb/libxcb-xinerama0_1.14-3_amd64.deb sudo dpkg -i libxcb-xinerama0_1.14-3_amd64.deb同理libgl1-mesa-dev需升级至21.2.6-0ubuntu0.2~20.04.3否则qmake -query QT_INSTALL_LIBS返回的OpenGL路径会指向不存在的libGL.so.1。更关键的是Python环境Qt6官方要求Python 3.7但Ubuntu 20.04默认Python 3.8.10而pyside6-tools用于pyside6-uic转换UI文件在3.8.10上存在shiboken6模块导入失败。解决方案是创建独立venvpython3 -m venv ~/qt6-env source ~/qt6-env/bin/activate pip install --upgrade pip setuptools wheel pip install pyside66.2.2.1 # 强制指定patch版本此时pyside6-uic才能正常解析.ui文件生成ui_mainwindow.py。所有这些步骤都不是Qt6文档里写的“安装依赖”而是2022年Ubuntu 20.04与Qt6.2.x交叠期特有的“环境对齐操作”。它不优雅但有效——就像拧紧一颗生锈的螺丝你得先滴润滑油再用加力杆。3. 核心模块实操SerialPort、Charts与自定义控件的落地细节3.1 解决“unknown module in qt:serialport”的七种可能路径当CMake报错unknown module in qt:serialport时90%的情况并非模块未安装而是路径未注册。Qt6将模块配置文件Qt6SerialPortConfig.cmake放在/opt/Qt6.2.2/6.2.2/gcc_64/lib/cmake/Qt6SerialPort/但CMake默认只搜索CMAKE_PREFIX_PATH中的lib/cmake子目录。因此在CMakeLists.txt中必须显式添加set(CMAKE_PREFIX_PATH /opt/Qt6.2.2/6.2.2/gcc_64/lib/cmake) find_package(Qt6 REQUIRED COMPONENTS Core Widgets SerialPort)但若公司使用统一构建系统CMAKE_PREFIX_PATH被全局覆盖则需改用find_package的PATHS参数find_package(Qt6 REQUIRED COMPONENTS Core Widgets SerialPort PATHS /opt/Qt6.2.2/6.2.2/gcc_64 NO_DEFAULT_PATH )第二种常见原因是Qt6.2.2的Qt6SerialPortConfig.cmake中硬编码了Qt6_DIR路径为/opt/Qt6.2.2/6.2.2/gcc_64/lib/cmake/Qt6而实际安装路径可能是/opt/Qt6.2.2/6.2.2/gcc_64少一级lib/cmake。此时需手动编辑该文件将set(Qt6_DIR ${CMAKE_CURRENT_LIST_DIR}/../../../)改为set(Qt6_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..)。第三种情况是qmake项目未声明模块在.pro文件中QT serialport必须写在QT widgets之后因为serialport依赖core而widgets隐式包含core。若顺序颠倒qmake解析时会因依赖未声明而跳过serialport。此外还需检查/opt/Qt6.2.2/6.2.2/gcc_64/plugins/下是否存在libqserialport.soLinux或qserialport.dllWindows缺失则说明离线包安装时未勾选SerialPort模块。最后若使用Conan管理依赖需确认conanfile.txt中[requires]部分未覆盖Qt6的find_package路径——Conan的generators cmake_find_package会生成自己的FindQt6.cmake优先级高于系统路径。3.2 Qt Charts性能调优从“卡顿”到“毫秒级刷新”的三次迭代用QChartView显示实时传感器数据时初始实现每秒刷新10次CPU占用率达45%图表拖拽明显卡顿。第一次优化是启用OpenGL渲染QChartView *chartView new QChartView(chart); chartView-setRenderHint(QPainter::Antialiasing); // 启用抗锯齿 chartView-setViewportUpdateMode(QGraphicsView::FullViewportUpdate); // 避免局部重绘 // 关键启用OpenGL QSurfaceFormat format; format.setRenderableType(QSurfaceFormat::OpenGL); format.setVersion(3, 3); QSurfaceFormat::setDefaultFormat(format); chartView-setViewport(new QOpenGLWidget());但效果有限因QLineSeries::append()内部仍进行坐标系重计算。第二次优化是批量追加数据将单点append(x,y)改为append(const QVectorQPointF points)每100ms收集一次数据点一次性插入。第三次也是最关键的优化是禁用动画并手动控制重绘时机chart-setAnimationOptions(QChart::NoAnimation); // 彻底关闭动画 // 在定时器回调中 void updateChart() { static int frameCount 0; if (frameCount % 5 0) { // 每5帧重绘一次即20fps chart-axisX()-setRange(currentMinX, currentMaxX); chart-axisY()-setRange(currentMinY, currentMaxY); chartView-repaint(); // 强制重绘避免事件队列延迟 } }实测结果CPU占用降至8%图表拖拽丝滑。这里的关键认知是Qt Charts的默认动画设计面向静态图表展示而非实时流数据。2022年Qt6.2.2的QChart类尚未提供setRealtimeMode(true)这样的专用接口必须通过关闭动画批量更新节流重绘三重手段模拟。另外QValueAxis的setLabelFormat若设置为%.3f在高频刷新时会触发字符串格式化开销应改为%.0f或预计算标签文本。3.3 自定义进度条从QProgressBar到QPainter重绘的精度跃迁标准QProgressBar的setValue()最小步进为1%无法满足工业设备固件升级时0.01%精度的需求。解决方案是继承QWidget用QPainter重绘class PreciseProgressBar : public QWidget { Q_OBJECT public: explicit PreciseProgressBar(QWidget *parent nullptr) : QWidget(parent), m_value(0.0) {} void setValue(double value) { // value范围0.0~100.0 if (value ! m_value) { m_value qBound(0.0, value, 100.0); update(); // 触发paintEvent } } protected: void paintEvent(QPaintEvent *event) override { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 背景矩形 QRectF bgRect(0, 0, width(), height()); painter.setBrush(QColor(230, 230, 230)); painter.drawRect(bgRect); // 进度矩形 qreal progressWidth (m_value / 100.0) * width(); QRectF progressRect(0, 0, progressWidth, height()); QLinearGradient gradient(0, 0, width(), 0); gradient.setColorAt(0, QColor(70, 130, 180)); gradient.setColorAt(1, QColor(30, 144, 255)); painter.setBrush(gradient); painter.drawRect(progressRect); // 文字 painter.setPen(Qt::white); painter.setFont(QFont(Arial, 9, QFont::Bold)); QString text QString::number(m_value, f, 2) %; QRectF textRect fontMetrics().boundingRect(text); painter.drawText(QPointF(width()/2 - textRect.width()/2, height()/2 textRect.height()/3), text); } private: double m_value; };此实现支持0.01%精度且无闪烁。但需注意update()调用频率过高会导致重绘队列积压应在业务逻辑中做节流例如// 固件升级回调中 void onProgressUpdate(double percent) { static QTime lastUpdate; if (lastUpdate.elapsed() 50) return; // 至少50ms间隔 lastUpdate.restart(); progressBar-setValue(percent); }此外QPainter::drawRect在高DPI屏幕下需乘以devicePixelRatio()否则线条模糊。2022年Qt6.2.2已支持QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling)但需在main()函数最开头调用晚于QApplication构造则无效。4. 工程化实践交叉编译、打包发布与调试避坑指南4.1 Ubuntu-20.04交叉编译环境构建链与Qt6 SDK的精准匹配为ARM64嵌入式设备编译Qt应用不能简单apt install gcc-aarch64-linux-gnu。2022年主流方案是使用Linaro GCC 11.2-2022.02因其对ARM64的__atomic_*指令支持完善。关键步骤有四第一下载Linaro工具链wget https://releases.linaro.org/components/toolchain/binaries/11.2-2022.02/aarch64-linux-gnu/gcc-linaro-11.2.1-2022.02-x86_64_aarch64-linux-gnu.tar.xz tar -xf gcc-linaro-11.2.1-2022.02-x86_64_aarch64-linux-gnu.tar.xz -C /opt/第二配置Qt6交叉编译SDKQt6.2.2提供aarch64-linux-gnu-g配置但需手动指定sysroot/opt/Qt6.2.2/6.2.2/Src/configure \ -platform linux-g \ -xplatform linux-aarch64-gnu-g \ -prefix /opt/Qt6.2.2/6.2.2/aarch64 \ -sysroot /opt/sysroots/aarch64-linux-gnu \ -device-option CROSS_COMPILE/opt/gcc-linaro-11.2.1-2022.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- \ -skip qtwebengine \ -no-compile-examples \ -nomake examples \ -nomake tests其中/opt/sysroots/aarch64-linux-gnu需包含lib、usr/include等目录可从Yocto build的tmp/sysroots/复制。第三生成CMake toolchain文件# aarch64-toolchain.cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_C_COMPILER /opt/gcc-linaro-11.2.1-2022.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /opt/gcc-linaro-11.2.1-2022.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g) set(CMAKE_FIND_ROOT_PATH /opt/sysroots/aarch64-linux-gnu;/opt/Qt6.2.2/6.2.2/aarch64) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)第四在CMake中指定cmake -DCMAKE_TOOLCHAIN_FILEaarch64-toolchain.cmake \ -DQt6_DIR/opt/Qt6.2.2/6.2.2/aarch64/lib/cmake/Qt6 \ ..若忽略CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLYCMake会错误地在宿主机/usr/lib中查找Qt库导致链接失败。4.2 Qt发布软件Linux AppImage与Windows NSIS的实操差异Qt官方linuxdeployqt工具在2022年已停止维护推荐使用appimagetool配合linuxdeploy。流程如下# 1. 构建Release版 mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_PREFIX_PATH/opt/Qt6.2.2/6.2.2/gcc_64 .. cmake --build . --config Release # 2. 复制可执行文件到AppDir mkdir MyApp.AppDir cp ../build/myapp MyApp.AppDir/ cp -r /opt/Qt6.2.2/6.2.2/gcc_64/plugins/platforms MyApp.AppDir/ cp -r /opt/Qt6.2.2/6.2.2/gcc_64/plugins/imageformats MyApp.AppDir/ # 3. 执行linuxdeploy需下载最新版 ./linuxdeploy-x86_64.AppImage --appdir MyApp.AppDir --executable myapp --output appimage关键点linuxdeploy会自动扫描myapp的DT_NEEDED段但若使用QSerialPort需手动复制libQt6SerialPort.so到MyApp.AppDir/usr/lib/否则运行时报libQt6SerialPort.so.6: cannot open shared object file。Windows平台则用NSIS; myapp.nsi OutFile MyApp-Setup.exe InstallDir $PROGRAMFILES\MyApp Section Install SetOutPath $INSTDIR File build\release\myapp.exe File C:\Qt6.2.2\6.2.2\mingw_64\bin\Qt6Core.dll File C:\Qt6.2.2\6.2.2\mingw_64\bin\Qt6Widgets.dll File C:\Qt6.2.2\6.2.2\mingw_64\plugins\platforms\qwindows.dll WriteRegStr HKLM Software\MyApp InstallDir $INSTDIR SectionEnd注意Qt6SerialPort.dll位于mingw_64\plugins\serialport\而非bin\目录必须单独复制。且NSIS脚本中File指令路径需用反斜杠\正斜杠/会导致路径解析失败。4.3 Qt崩溃调试从core dump到QMessageLogger的精准定位Qt程序在Ubuntu 20.04上崩溃时gdb常停在QMetaObject::activate无法定位具体信号槽。根本原因是Qt6默认关闭了调试符号。解决方案分三步第一编译时添加调试信息cmake -DCMAKE_BUILD_TYPERelWithDebInfo -DCMAKE_PREFIX_PATH/opt/Qt6.2.2/6.2.2/gcc_64 ..第二启用Qt消息日志在main()开头添加qputenv(QT_LOGGING_RULES, qt.qpa.*true;qt.core.*true); qInstallMessageHandler(myMessageHandler); // 自定义处理器第三捕获崩溃信号#include signal.h void crashHandler(int sig) { qDebug() Crash signal: sig; // 生成core dump struct rlimit core_limit; core_limit.rlim_cur core_limit.rlim_max RLIM_INFINITY; setrlimit(RLIMIT_CORE, core_limit); raise(sig); } int main(int argc, char *argv[]) { signal(SIGSEGV, crashHandler); signal(SIGABRT, crashHandler); QApplication app(argc, argv); // ... }然后用gdb ./myapp core加载core文件执行bt full查看完整堆栈。若仍无法定位可在疑似崩溃点前插入qDebug() Q_FUNC_INFO;利用Qt6的QMessageLogger机制输出函数名、文件、行号比printf更可靠。5. 新人必踩的十个坑与我的实操心得5.1 “qt designer下载”误区Designer已集成无需单独下载搜索“qt designer下载”会导向旧版独立安装包但Qt6.2.2起Qt Designer已作为designer可执行文件内置在/opt/Qt6.2.2/6.2.2/gcc_64/bin/中。直接运行./designer即可打开。若提示libQt6DesignerComponents.so: cannot open shared object file说明未设置LD_LIBRARY_PATHexport LD_LIBRARY_PATH/opt/Qt6.2.2/6.2.2/gcc_64/lib:$LD_LIBRARY_PATH ./designer更推荐的方式是在Qt Creator中右键.ui文件选择“Edit in Qt Designer”Creator会自动调用内置Designer避免路径问题。5.2 “qt console connect”陷阱QProcess与终端交互的缓冲区真相用QProcess执行ls -l能正常获取输出但执行python3 -c print(hello); import time; time.sleep(2)时readyReadStandardOutput()只触发一次。这是因为Python默认启用输出缓冲print内容未立即flush。解决方案QProcess *proc new QProcess; proc-start(python3, QStringList() -u -c print(hello); import time; time.sleep(2)); // -u参数强制Python使用未缓冲输出或在Python代码中显式sys.stdout.flush()。同理ssh命令需加-T参数禁用伪终端分配否则QProcess无法读取stdout。5.3 “qt发布软件”后图标丢失资源路径与QRC的绑定逻辑打包后的AppImage图标显示为默认齿轮是因为QIcon::fromTheme(myapp)在Linux上依赖/usr/share/icons而AppImage是沙盒环境。正确做法是QIcon icon; icon.addFile(:/icons/app-icon.png, QSize(), QIcon::Normal, QIcon::Off); QApplication::setWindowIcon(icon);其中:/icons/app-icon.png需在.qrc文件中声明RCC qresource prefix/ fileicons/app-icon.png/file /qresource /RCC且.qrc文件必须在CMakeLists.txt中通过qt_add_resources注册qt_add_resources(RESOURCES icons.qrc) add_executable(myapp main.cpp ${RESOURCES})否则qrc资源不会编译进二进制。5.4 “qt曲线刷新能放在另一个线程里面吗”QThread与QTimer的终极选择直接在QThread中调用QChart::addPoints()会崩溃因为QChart对象必须在GUI线程创建和访问。正确模式是// 数据采集线程 class DataThread : public QThread { Q_OBJECT public: void run() override { while (!isInterruptionRequested()) { QVectorQPointF points acquireData(); emit newData(points); // 信号跨线程传递 msleep(100); } } signals: void newData(const QVectorQPointF points); }; // GUI线程接收 connect(dataThread, DataThread::newData, this, MainWindow::onNewData); void MainWindow::onNewData(const QVectorQPointF points) { series-append(points); // 安全在GUI线程执行 }但更轻量的方案是使用QTimer::singleShot(0, ...)void MainWindow::startAcquisition() { QTimer::singleShot(0, this, [this]() { QVectorQPointF points acquireData(); series-append(points); QTimer::singleShot(100, this, MainWindow::startAcquisition); // 递归启动 }); }这避免了线程管理开销且singleShot(0,)确保在事件循环空闲时执行本质是异步非阻塞。5.5 “vscode配置qt designer”VS Code的UI编辑器替代方案VS Code官方不支持Qt Designer.ui文件可视化编辑。可行方案是安装扩展Qt for Python提供.ui文件语法高亮和pyside6-uic命令快捷键在settings.json中配置任务{ version: 2.0.0, tasks: [ { label: uic, type: shell, command: pyside6-uic, args: [-o, ${fileBasenameNoExtension}_ui.py, ${file}], group: build } ] }然后CtrlShiftP “Tasks: Run Task” “uic”即可转换。真正的UI设计仍需Qt Creator或独立Designer。5.6 “qt怎么调用halcon”C混编的ABI兼容性红线Halcon 20.12 Linux版仅提供GCC 9.3编译的库而Qt6.2.2默认用GCC 11.2。强行链接会导致std::stringABI不兼容。解决方案编译Halcon wrapper时用GCC 9.3g-9.3 -stdc17 -shared -fPIC halcon_wrapper.cpp -lhalcon -o libhalcon_wrapper.so在Qt项目中用extern C声明wrapper函数避免C name manglingCMakeLists.txt中指定编译器set(CMAKE_CXX_COMPILER /usr/bin/g-9.3) find_package(Halcon REQUIRED PATHS /opt/halcon) target_link_libraries(myapp PRIVATE Halcon::Halcon libhalcon_wrapper.so)否则std::string传参会引发段错误。5.7 “qt获取文件信息”QFileInfo的线程安全边界QFileInfo::size()、QFileInfo::lastModified()在多线程中调用是安全的但QFileInfo::exists()在NFS挂载点上可能阻塞。生产环境应QFileInfo info(filePath); if (QThreadPool::globalInstance()-maxThreadCount() 1) { // 启用线程池异步检查 QFutureWatcherbool *watcher new QFutureWatcherbool(this); connect(watcher, QFutureWatcherbool::finished, []() { if (watcher-result()) { // 文件存在 } watcher-deleteLater(); }); watcher-setFuture(QtConcurrent::run([filePath]() { return QFileInfo(filePath).exists(); })); } else { bool exists info.exists(); // 直接调用 }5.8 “qt崩溃”时的core文件生成Ubuntu 20.04的systemd限制Ubuntu 20.04默认禁用core dump需修改echo kernel.core_pattern/tmp/core.%e.%p | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 对systemd用户服务 echo LimitCOREinfinity | sudo tee -a /etc/systemd/system.conf sudo systemctl daemon-reload否则ulimit -c unlimited在systemd环境下无效。5.9 “qt ui”文件中文乱码UTF-8 BOM的隐形杀手Designer保存的.ui文件若含BOMByte Order Markuic转换时会将string中文/string解析为乱码。解决方法在Qt Creator中Tools Options Text Editor File Encodings将“Default encoding”设为UTF-8取消勾选“Add BOM to UTF-8 files”对已有文件用vim删除BOM:set nobomb:w。5.10 “qt打包”后字体异常Fontconfig缓存与系统字体路径AppImage中QFontDatabase::addApplicationFont()加载的字体在某些Linux发行版上显示为方块。原因是Fontconfig未扫描AppImage内的字体路径。解决方案// 在main()中 QFontDatabase::addApplicationFont(:/fonts/SourceHanSansSC-Regular.otf); // 强制刷新字体数据库 QFontDatabase::loadAllFonts(); // 设置全局字体 QApplication::setFont(QFont(Source Han Sans SC, 10));且.qrc中字体文件必须设为binary类型避免文本编码转换。提示所有这些坑我都踩过。第一次qt unknown module in qt:serialport时我重装了三次Qt SDK第一次AppImage图标丢失我花了两小时排查QRC前缀第一次QChart卡顿我误以为是硬件问题换了三台测试机。2022年的Qt6不是一套完美的工具而是一张需要亲手编织的网——你得理解每个结点的张力才能让整张网托住你的应用。现在你可以跳过我走过的弯路直接用这些经过验证的步骤。但请记住技术没有银弹只有持续验证的耐心。
返回列表