Skip to content

fix: tooltip does not show the latest text#725

Merged
18202781743 merged 1 commit intolinuxdeepin:masterfrom
yixinshark:fix-tooltip
Feb 3, 2026
Merged

fix: tooltip does not show the latest text#725
18202781743 merged 1 commit intolinuxdeepin:masterfrom
yixinshark:fix-tooltip

Conversation

@yixinshark
Copy link
Contributor

在这paintEvent中判断文本是否发生变化,如果变化了则调用DToolTip::setShowToolTip(this, false)重置状态, 确保Tooltip能显示最新的文本内容。为此在DLabelPrivate中增加了lastText成员变量用于记录上一次的文本。

Check if the text has changed in paintEvent. If it has changed, call DToolTip::setShowToolTip(this, false) to reset the status, ensuring that the Tooltip displays the latest text content. To achieve this, a lastText member variable was added to DLabelPrivate to record the previous text.

Log: fix tooltip does not show the latest text
Pms: BUG-300837

@yixinshark
Copy link
Contributor Author

@18202781743

在这paintEvent中判断文本是否发生变化,如果变化了则调用DToolTip::setShowToolTip(this, false)重置状态,
确保Tooltip能显示最新的文本内容。为此在DLabelPrivate中增加了lastText成员变量用于记录上一次的文本。

Check if the text has changed in paintEvent. If it has changed, call DToolTip::setShowToolTip(this, false)
to reset the status, ensuring that the Tooltip displays the latest text content. To achieve this,
a lastText member variable was added to DLabelPrivate to record the previous text.

Log: fix tooltip does not show the latest text
Pms: BUG-300837
@deepin-ci-robot
Copy link
Contributor

deepin pr auto review

这段代码主要实现了在 DLabel 文本发生变化时,重置工具提示的显示状态,以确保工具提示能够显示更新后的文本。以下是对这段代码的详细审查及改进建议:

1. 语法逻辑审查

  • 正确性:代码逻辑基本正确。通过比较当前文本 d->text 和上一次记录的文本 d_func()->lastText,判断文本是否发生了变化。如果变化了,则调用 DToolTip::setShowToolTip(this, false) 来重置提示状态,并更新 lastText
  • 调用位置:这段代码被放置在 paintEvent 中。这意味着每次重绘(例如窗口大小改变、遮挡恢复等)时都会执行这个检查。虽然逻辑上是通的,但 paintEvent 是高频调用的函数,将逻辑判断放在此处需要考虑性能影响。

2. 代码质量审查

  • 变量命名lastText 命名清晰,能够准确表达其用途。
  • 注释:注释 // clear flag when text changed, avoid tooltip don't show new text 解释了代码的意图,但语法稍显生硬("avoid tooltip don't show" 双重否定)。建议修改为更自然的表达。
  • 初始化:在 dlabel_p.h 中新增了成员变量 lastText,但代码片段中未显示其初始化逻辑。建议在 DLabelPrivate 的构造函数中将其初始化为空字符串或当前文本,以避免未定义行为(如比较未初始化的内存)。

3. 代码性能审查

  • 性能隐患paintEvent 是非常频繁触发的函数。在 paintEvent 中进行 QString 的比较操作(d->text != d_func()->lastText)会产生不必要的开销,特别是当文本并未改变时。
  • 建议:应该监听文本变化的事件或重写设置文本的函数(如 setText),在文本修改的源头进行拦截和处理,而不是在绘图中检查。这样只有当文本真正改变时才会执行逻辑,效率更高。

4. 代码安全审查

  • 线程安全:Qt 的 GUI 相关操作通常必须在主线程进行。paintEvent 肯定在主线程,因此这里的逻辑是线程安全的。
  • 空指针/有效性d_func()d 指针的使用符合 DTK/Qt 的私有类规范,相对安全。

5. 改进建议代码

建议一:优化注释和变量初始化(保持原逻辑位置)

如果必须保留在 paintEvent 中,建议优化注释并确保初始化。

dlabel_p.h

// 在构造函数中初始化
DLabelPrivate::DLabelPrivate(DLabel *qq) : DObjectPrivate(qq)
    , lastText() // 确保初始化为空
{
}

// ... 成员变量 ...
QString lastText;

dlabel.cpp

// ... paintEvent 中 ...
// 文本变更时重置提示标志,确保工具提示显示最新内容
if (d->text != d_func()->lastText) {
    DToolTip::setShowToolTip(this, false);
    d_func()->lastText = d->text;
}
// ...

建议二:性能优化方案(推荐)

将逻辑移至 setText 方法(假设 DLabel 继承自 QLabel 或有类似的 setText 方法)。这样只有文本真正改变时才触发逻辑,避免了在重绘时无谓的字符串比较。

dlabel_p.h

class DLabelPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate
{
public:
    // ...
    DPalette::ColorType color = DPalette::NoType;
    Qt::TextElideMode elideMode = Qt::ElideNone;
    // 如果仅仅为了 tooltip 逻辑,可能不再需要这个成员变量,
    // 除非有其他地方依赖它。如果保留,需确保初始化。
    QString lastText; 
};

dlabel.cpp

// 假设存在或添加 setText 方法
void DLabel::setText(const QString &text)
{
    // 只有文本真正改变时才处理
    if (d_func()->text != text) {
        // 调用基类设置文本
        QLabel::setText(text); // 或者 DLabel 的基类
        
        // 文本变更时重置提示标志,确保工具提示显示最新内容
        DToolTip::setShowToolTip(this, false);
        
        // 更新 lastText(如果后续逻辑仍需要它)
        d_func()->lastText = text;
    }
}

// paintEvent 可以移除相关逻辑,保持简洁
void DLabel::paintEvent(QPaintEvent *event)
{
    // ... 原有绘制逻辑 ...
}

总结

原代码在功能上是可以工作的,但从性能角度看,在 paintEvent 中处理业务逻辑不是最佳实践。强烈建议采用建议二,将状态重置逻辑移动到数据修改的源头(setText),这样可以显著提高性能,并使代码职责更加清晰。如果无法修改 setText,请务必确保 lastText 被正确初始化。

@deepin-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: 18202781743, yixinshark

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@18202781743 18202781743 merged commit 7bdd4e1 into linuxdeepin:master Feb 3, 2026
21 of 22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants