正常
卡住怎么办
← 手册首页
按症状查。每条给方向,不给整段答案——成品 repo 在 widget/password-edit/,对照着看。
cpp 编译报 expected type-specifier before 'QHBoxLayout' / 'QVBoxLayout'
- 构造里
new QHBoxLayout/new QVBoxLayout,但 cpp 只引了QLineEdit/QToolButton,漏了布局类头。Q_OBJECT 类的 cpp 不像头文件那样顺手引布局类,新加布局代码要单独引。→src/password_edit.cpp:9/src/password_edit.cpp:13 - 同理检查
QLabel(色块要用)在 cpp 里引了吗?→src/password_edit.cpp:10 - 进阶排查:QWidget 基类
点眼睛按钮没反应 / echoMode 没切
QToolButton::clicked真的连上了吗?构造里漏了connect(toggle_btn_, &QToolButton::clicked, ...)。→src/password_edit.cpp:65- clicked 连的 lambda 里翻的是
text_visible_吗?写成setTextVisible(visible)(没取反)就永远只设一个方向。正确是setTextVisible(!text_visible_) - setTextVisible 里改的是 echoMode 吗?漏了
edit_->setEchoMode(visible ? Normal : Password)。→src/password_edit.cpp:88 - 进阶排查:QLineEdit 入门
打字过程中色块疯狂闪烁 / demo 接到一堆重复 strengthChanged
onTextChanged是不是无条件刷新了?正确姿势是先computeStrength,只有new_strength != strength_才刷新 + emit。→src/password_edit.cpp:153- 信号去重机制不熟?信号与槽
勾选框和显隐态双向联动后,点一下程序卡死 / 崩
- 这是双向连线成环 + 没有去重早返导致无限递归栈溢出。
textVisibleChanged → setChecked → toggled → setTextVisible → textVisibleChanged死循环。→ setTextVisible 入口必须if (text_visible_ == visible) return早返,环走到第二次值已相同直接 return。→src/password_edit.cpp:84 - 双向连线两条都接了吗?
textVisibleChanged → setChecked+toggled → setTextVisible缺一条就不叫双向,但两条都接就得有早返防环。→demo/password_edit_window.cpp:61
刚启动、还没打字,色块显示异常 / strength() 返回脏值
- 成员
strength_有没有给初值?声明应是Strength strength_{Strength::kWeak}。→include/password_edit.h:97 - 构造末尾调了
updateStrengthIndicator()吗?没调首屏色块状态不确定。→src/password_edit.cpp:67
空文本时强度档返回意外值
- computeStrength 有没有在入口显式处理空文本?空串 length=0,应直接
return Strength::kWeak。→src/password_edit.cpp:111 - 别依赖
length < 6这种后续逻辑碰巧覆盖空串——显式兜底才稳
demo 想回显真实文本,用了 edit_->findChild<QLineEdit*>() 拿不到 / 崩
- 这是把 demo 和控件内部成员耦合的脆弱 hack。
findChild可能返回空指针解引用崩,且内部一重构 demo 就废。→ 给 PasswordEdit 加textChanged(QString)信号,构造透传内部QLineEdit::textChanged,demo 改用&PasswordEdit::textChanged。→src/password_edit.cpp:64/demo/password_edit_window.cpp:81 - 同理 demo 想读当前文本应调
edit_->text()(公开 API),别 findChild 内部控件
强度算法算出的档和预期不符
- 种类统计是不是把符号漏了?
isLower/isUpper/isDigit之外的字符(标点、空格、中文)一律算符号,用 else 兜。→src/password_edit.cpp:125 - 档位判定顺序对吗?「种类 >= 3 但长度 < 8」应落 kMedium 不是 kStrong——
classes >= 3 && length >= 8两个条件都要满足才是 kStrong。→src/password_edit.cpp:141 - 「种类 == 2」是不是没单独判?种类 2 直接 kMedium,别让它掉到下面的 kStrong 判定。→
src/password_edit.cpp:137
moc 报错(Q_PROPERTY / Q_ENUM 不认识)
- 类有没有
Q_OBJECT?→include/password_edit.h:28 - CMake 有没有开 AUTOMOC(
set(CMAKE_AUTOMOC ON))?→widget/CMakeLists.txt - Q_ENUM 的 Strength 是不是在 PasswordEdit 类里、Q_ENUM 紧跟其后?→
include/password_edit.h:38/include/password_edit.h:39 - 进阶排查:QObject 与元对象系统