C++/Qt 方向实训 · 第 4 / 4 个讲授日
今晚的作业「本地数据存储小工具」是明天 Day5 综合案例的直接前身。
上午 · 讲授 08:30–11:00
app.exec() 今天拆开看:事件循环不停从队列取 QEvent
派发给目标控件——事件是框架推给控件的通知(鼠标/键盘/重绘),信号槽是
对象间的主动通知,两套机制并存不冲突。出处:p03/ch02/minimal_qt_app.cpp(exec())
mousePressEvent() 等虚函数(只影响自己);
installEventFilter()(一个对象统一拦截多个控件的事件)。
事件有 accept()/ignore() 状态,决定是否继续向父控件传播。QWidget::mousePressEvent(e))——
控件默认行为悄悄丢失,现象诡异难查。出处:p03/ch09/event_override_customwidget.cpp · event_filter_mainwindow.cpp · mouse_event.cpp
paintEvent()
里,由 Qt 按需调用;数据变了想重画,调 update()(异步排队一次重绘请求)。
绘图设备三件套 QImage/QPixmap/QPicture 作参考。paintEvent 之外直接构造 QPainter 画窗口——未定义行为;update()——界面不会自动重画。出处:p03/ch10/qpainter_basic.cpp (设备类参考:paint_device_qimage.cpp 等)
QTableWidgetItem,new 出来交给表格
接管所有权),上手快、中小项目够用;"表格事件"以信号暴露:
cellClicked / cellDoubleClicked / itemChanged。dataChanged 等信号视图才会刷新。数据规模大/多视图联动时的
正解,自学入口:examples/model_view/。出处:examples/table_widget/qt_table_widget_basics.cpp (README)
上午 · 课堂练习 11:00–12:00(工程师指导、答疑)
paintEvent 里画一个组合图形(棋盘格或仪表盘刻度)下午 · 讲授 13:30–16:00
QFile/QTextStream/QDataStream 都建立在
QIODevice 统一接口上——之后遇到网络/串口也是同一套;
QTextStream 面向文本行,QDataStream 面向结构化二进制。open() 返回值不检查——文件不存在/没权限时静默失败,
后续读写全是空操作;出处:p03/ch11/qfile_basic.cpp · qtextstream_io.cpp · qdatastream_io.cpp
QJsonDocument/Object/Array/Value 四件套,
QJsonValue 是能装多种类型的变体。QJsonParseError:格式坏的输入静默变成空文档;toInt()/toString() 不报错只返回默认值——
数据悄悄丢,很难查。
QFile bad("data.json"); // ✗ 相对当前工作目录——它在哪取决于你怎么启动
QFile good(QCoreApplication::applicationDirPath() + "/data.json"); // ✓ 锚定可执行文件位置
applicationDirPath() 拼路径,或只读资源走 .qrc(昨天的资源卡)。
QTextStream ts(&file);
ts.setCodec("UTF-8"); // Qt 5 默认编码随平台/区域设置而变——跨机器必须显式指定
下午 · 课堂作业 16:00–17:00(工程师答疑)
applicationDirPath() 拼(今天的坑卡现学现用)现场演示「写入 → 重启 → 读回」完整闭环;讲得出 open()/ParseError 两处检查为什么不能省。
明天 Day5 全天综合项目案例:学员信息管理器——今天的作业就是 它的雏形;还要补上最后一块拼图:多线程防卡界面。