fix: 修复摄像头重连和重启后分辨率恢复默认值#476
Conversation
There was a problem hiding this comment.
Sorry @Resurgamz, you have reached your weekly rate limit of 500000 diff characters.
Please try again later or upgrade to continue using Sourcery
1ad550e to
7d263c9
Compare
ON 阶段 setData 触发 DTK widget 重建时读到 OFF 阶段清零的 value=0,
中间态的 resolutionchanged 异步将相机切到错误分辨率,settingDialog 重新打开时
以相机当前错误分辨率覆盖了已保存的用户选择。
- ON 分支用 m_updatingResolution 标志抑制 setData/setOption 的中间态信号,
QTimer::singleShot 在所有排队信号处理后发射一次正确值
- settingDialog 优先读 option 已保存值,设备分辨率作为 fallback
- switchCameraSuccess 连接 setNewResolutionList,启动和重连均触发 ON 分支恢复
- switchCameraSuccess 无条件发射,构造函数路径也能进入 ON 分支
Log: 修复摄像头重连和应用重启后分辨率恢复为默认值
Bug: https://pms.uniontech.com/bug-view-363077.html
deepin pr auto review你好!我是CodeGeeX。我已仔细审查了你提供的Git Diff。本次修改主要涉及分辨率列表更新的逻辑优化、信号发射时机的控制(防抖/抑制中间态)、摄像头切换时的状态恢复,以及部分代码的健壮性修复。 整体来看,这次修改解决了一些潜在的崩溃问题(如数组越界)和信号重复发射的问题,方向是正确的。但在语法逻辑、代码质量和性能方面,还有一些可以进一步改进和探讨的地方。 以下是详细的审查意见: 一、 语法与逻辑
二、 代码质量
三、 代码性能
四、 代码安全
总结与修改建议代码示例针对以上审查,我为你提供一份优化后的代码片段供参考: Settings.h: // 将 m_updatingResolution 移到 private,并改名
private:
bool m_isUpdatingResolution = false;Settings.cpp: // ... 前面代码不变
for (int i = 0; i < resolutionDatabase.size(); i++) {
// 优化:避免循环内频繁 split 分配内存,且更安全
const QString &resStr = resolutionDatabase[i];
int sepIndex = resStr.indexOf('x');
if (sepIndex > 0 && sepIndex < resStr.length() - 1) {
int w = resStr.leftRef(sepIndex).toInt();
int h = resStr.midRef(sepIndex + 1).toInt();
if (v4l2core_get_frame_width(get_v4l2_device_handler()) == w &&
v4l2core_get_frame_height(get_v4l2_device_handler()) == h) {
defres = i;
break;
}
}
}
// 抑制中间态的 resolutionchanged, 仅在最后发射一次正确值
m_isUpdatingResolution = true;
resolutionmodeFamily->setData("items", resolutionDatabase);
m_settings->setOption(QString("outsetting.resolutionsetting.resolution"), defres);
// 注意:因为 context 传了 this,如果 this 销毁,该 lambda 不会执行,生命周期安全
QTimer::singleShot(0, this, [this, resolutionDatabase, defres]() {
m_isUpdatingResolution = false;
if (defres >= 0 && defres < resolutionDatabase.size()) {
emit resolutionchanged(resolutionDatabase[defres]);
}
});
// ... 后面代码不变videowidget.cpp: // 更安全的空指针判断,且保持原有"空名称不发信号"的语义
if (devName && devName[0] != '\0') {
emit switchCameraSuccess(devName);
} |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: max-lvs, Resurgamz The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
/merge |
|
This pr cannot be merged! (status: unstable) |
|
/merge |
ON 阶段 setData 触发 DTK widget 重建时读到 OFF 阶段清零的 value=0,
中间态的 resolutionchanged 异步将相机切到错误分辨率,settingDialog 重新打开时
以相机当前错误分辨率覆盖了已保存的用户选择。
Log: 修复摄像头重连和应用重启后分辨率恢复为默认值
Bug: https://pms.uniontech.com/bug-view-363077.html