有没有比使用RegExp更好的方法在QToolTip中自动换行文本?

时间:2011-01-25 16:02:34

标签: c++ qt

所以问题出在标题中。 QToolTip似乎没有提供wordwraop功能。但是,使用正则表达式可以用\ n替换第N个空格,但我想知道是否有人建议更好的溶剂化。 具体来说,我的方法问题是它不考虑文本的长度。例如,我希望更长的文本形成更广泛的段落。

5 个答案:

答案 0 :(得分:20)

如果工具提示中的文字是富文本,则会自动换行。

这是一个简单的例子,将字体设置为黑色使其成为“富文本”,因此它会被包装。省略字体声明意味着工具提示将是纯文本并扩展屏幕的整个长度。

QString toolTip = QString("<FONT COLOR=black>");
toolTip += ("I am the very model of a modern major general, I've information vegetable animal and mineral, I know the kinges of England and I quote the fights historical from Marathon to Waterloo in order categorical...");
toolTip += QString("</FONT>");
widget->setToolTip(sToolTip);

当然,对于此示例,工具提示的宽度取决于平台。

Qt错误跟踪器中有一个关于此问题的新建议:https://bugreports.qt.io/browse/QTBUG-41051。它还要求宽度可以更改。

答案 1 :(得分:7)

替代答案:在工具提示的开头使用<nobr>指定将定义宽度的文本部分。例如:

<nobr>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed</nobr>
do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.

<nobr></nobr>之间的文字将强制最小宽度。其余的将相应地包装。 (如果您对Qt使用的默认宽度不满意,这会很有帮助,这在我的经验中往往过于狭窄。)

答案 2 :(得分:2)

根据Qt's QToolTip documentation

Rich text displayed in a tool tip is implicitly word-wrapped unless specified differently with <p style='white-space:pre'>.

您使用的是什么版本的Qt?

答案 3 :(得分:2)

如上所述,最简单的解决方案是强制使用工具提示为富文本。但是,除非您真的知道自己在做什么,否则请不要指定文字颜色。许多配色方案不使用黑色作为工具提示文本颜色,有些甚至可能将其用作背景,使您的工具提示难以辨认!还有很多其他方法可以“触发”富文本模式。

那就是说,我发现Qt的默认富文本包装有时会导致整体宽度比我想要的要小,这就是我编写这个小函数的原因:

QString splitTooltip(QString text, int width) 
{ 
    QFontMetrics fm(QToolTip::font()); 
    QString result; 

    for (;;) { 
        int i = 0; 
        while (i < text.length()) { 
            if (fm.width(text.left(++i + 1)) > width) { 
                int j = text.lastIndexOf(' ', i); 
                if (j > 0) 
                    i = j; 
                result += text.left(i); 
                result += '\n'; 
                text = text.mid(i+1); 
                break; 
            } 
        } 
        if (i >= text.length()) 
            break; 
    } 
    return result + text; 
} 

这适用于纯文本,并允许您指定所需的最大宽度(以像素为单位)。它考虑了文本的实际渲染宽度,而不仅仅是字符数。

答案 4 :(得分:0)

要结合以上答案,这是我的实现。受到大家的启发。

template<class Ty>
void BasicDpiAwareWidget<Ty>::setToolTip(const QString& tip) {
    if (tip.isEmpty()) {
        return;
    }

    const float kMinTooltipWidth = 400;

    QFontMetrics fm(font());

    int tip_width = fm.width(tip);

    QString html_escaped_tip = tip.toHtmlEscaped();

    if (tip_width <= kMinTooltipWidth) {
        html_escaped_tip.append("</p>");
    }
    else {
        int line_break_index = kMinTooltipWidth / tip_width * tip.size();
        html_escaped_tip.insert(line_break_index, "</p>");
    }

    // See [http://doc.qt.io/qt-5/qtooltip.html#details] for details.
    // Rich text displayed in a tool tip is implicitly word-wrapped unless specified differently with <p style='white-space:pre'>.
    Ty::setToolTip("<style>p { margin: 0 0 0 0 }</style><p style='white-space:pre'>" + html_escaped_tip);
}