隐藏QLabel基于文本大小

时间:2014-06-26 14:28:50

标签: qt text label autoresize

我想编写一个自定义QLabel子类,其中包含一些响应式设计的功能。在这个例子中,我想编写一个QLabel,它根据可用空间缩放文本。这很容易,但由于Qt-intern的东西也有一些问题。 (我必须将文本缩放到可用空间的0.9,否则调整窗口/小部件的大小会出错)

现在,当字体大小低于特定阈值时,我想添加一种完全隐藏标签的方法。但是,这似乎是一项相当复杂的任务。

以下是我在类resizeEvent(QResizeEvent *event)函数中使用的内容。 现在,我的函数只在大小低于阈值时将文本设置为""

void CustomLabel::resizeEvent (QResizeEvent * event ) {
    if(autoFontResize) {
        this->setSilentText(labelText); // just the normal setText function, I overwrote it for the subclass
        QFont f = this->font();
        int flags = Qt::TextDontClip|Qt::TextWordWrap;
        QRect fontBoundRect = this->fontMetrics().boundingRect(this->rect(), flags, this->text());
        float xFactor = (float)event->size().width()  / (float)fontBoundRect.width();
        float yFactor = (float)event->size().height() / (float)fontBoundRect.height();
        float factor = xFactor < yFactor ? xFactor : yFactor;

        f.setPointSizeF(f.pointSize()*factor*0.9); // 
        if(minimumFontSize != 0) { // 0 = no minimum Size for the font
            if(f.pointSize() < minimumFontSize) {
                if(hideFontOnMinimum) {  // either Hide or set to the limit size
                    this->setSilentText(""); //replace text                 
                } else {
                    f.setPointSizeF(minimumFontSize);
                }
            } 
        }

        this->setFont(f);
    }
    QLabel::resizeEvent(event);
}

顺便说一下,代码的某些部分是在stackoverflow上找到的,而不是我的。 ;) 我想做的是完全hide()标签。但是标签不知道它何时可以再次show(),因为之后似乎没有调用resizeEvent。

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

正如您所注意到的,如果您在窗口小部件上调用hide(),则无法收到resize事件。既然您无论如何都要自定义类,而不是调用hide(),您可以设置一个类变量来注意它隐藏并重载paintEvent函数,而不是在设置变量时绘制小部件: -

void CustomLabel::paintEvent(QPaintEvent * event)
{
    if(m_hideOnMinimum)
        return;

    QLabel::paintEvent(event);
}

请注意,通过不绘制标签,它将被隐藏,但用户仍然可以与之交互,因此您需要禁用它或重载键盘/鼠标事件。