正常
卡住怎么办
← 手册首页
按症状查。每条给方向,不给整段答案——成品 repo 在 widget/log-viewer/,对照着看。
cpp 编译报 expected type-specifier before 'QFontDatabase' / 'QFontDatabase' has not been declared
- 构造里用了
QFontDatabase::systemFont(...)设等宽字体,但 cpp 顶部漏引<QFontDatabase>?Q_OBJECT 类的 cpp 不像头文件那样顺手引字体类。→ 顶部补#include <QFontDatabase>,对照src/log_viewer.cpp:9 - 是不是误把
QFontDatabase当成只读.h里需要的,忘在 cpp 引?设字体的代码在 cpp,就得 cpp 引。
等宽字体没生效,日志列还是参差不齐
- 是不是用了
QFont("Monospace")这种按名字取字体的写法?系统上未必有这个名字的字体。改用QFontDatabase::systemFont(QFontDatabase::FixedFont)取系统首选等宽字体。→src/log_viewer.cpp:23 - 是不是干脆没设字体?默认比例字体下时间戳 / 级别列宽不一,看着乱。
- 进阶排查:QFontDatabase
Info 行在深色主题下看不见 / 浅色主题下太刺眼
colorForLevel是不是给 Info 也硬编码了黑或白?这会在某个主题下不可读。让 Info 返回默认构造的QColor()(isValid()==false),append里只对有效色setForeground,Info 行用 view 默认前景色跟着主题走。→src/log_viewer.cpp:129/src/log_viewer.cpp:47- 主题切换不熟?查 QPalette /
QGuiApplication::palette()。
裁旧行数对不上(删多了 / 删不干净 / 行数显示漂移)
- 是不是自己维护了一个行计数器?clear 之后没清零、或和 document 实际块数漂移就会出错。改用
view_->blockCount()当唯一真相源。→src/log_viewer.cpp:155 - 删除循环是不是漏了把行尾
\n带进选区?只movePosition(NextBlock, KeepAnchor)不够,还得movePosition(NextCharacter, KeepAnchor)带上换行,否则删不干净。→src/log_viewer.cpp:163-169
append 后没滚到底,最新行看不到
autoScroll默认开,但滚底代码是不是只调了moveCursor(End)没调ensureCursorVisible()?前者挪光标、后者才让视口跟着滚,两件套缺一不可。→src/log_viewer.cpp:60-61- 是不是在裁旧之前滚的底?得先裁后滚,滚到的才是最终末尾。→
src/log_viewer.cpp:56裁旧在src/log_viewer.cpp:58滚底之前 - 进阶排查:QPlainTextEdit
新行没独立成块,裁旧时把两行黏一起删
- insertText 前是不是没补
\n?文末非空时直接 insertText,新行会和旧行黏在一块,按块裁旧就错乱。判断!cursor.atStart()时先补一个\n。→src/log_viewer.cpp:51 - 这步和 step 6 裁旧直接挂钩:
\n保证每条日志独立成块,按块删才干净。
setMaxLines 调小后旧行没被裁,要等下次 append
- setter 是不是只改了
max_lines_、emit 了信号,没主动裁旧?不裁旧行就残留在 document 里,控件状态不自洽。clamp 完、emit 前先调一次trimOldBlocks()。→src/log_viewer.cpp:93 - 进阶排查:属性系统深度拆解
moc 报错(Q_PROPERTY / Q_ENUM 不认识)
- 头文件有没有
Q_OBJECT?→include/log_viewer.h:26 - CMake 有没有开 AUTOMOC(
set(CMAKE_AUTOMOC ON))?→widget/CMakeLists.txt - Q_ENUM 的 Level 枚举是不是在类里、Q_ENUM 紧跟其后?→
include/log_viewer.h:36-37 - 进阶排查:QObject 与元对象系统