【问题标题】:hide QLabel based on text-size根据文本大小隐藏 QLabel
【发布时间】:2014-06-26 14:28:49
【问题描述】:

我想编写一个自定义 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。

有什么想法吗? 谢谢!

【问题讨论】:

    标签: qt text label autoresize


    【解决方案1】:

    正如您所注意到的,如果您在小部件上调用 hide(),它将无法接收调整大小事件。由于您无论如何都在自定义类,而不是调用 hide(),因此您可以设置一个类变量以注意它是隐藏的并重载 paintEvent 函数,如果设置了变量,则不绘制小部件:-

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

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

    【讨论】:

    • 这将隐藏标签,但仍会保留空间。 :( 我也尝试将宽度设置为固定值 0。也没有用。
    • 您的意思是布局中的空间?是的,虽然你也可以从布局中删除它。
    • 如果我将它从布局中删除,标签如何检测是否有足够的空间再次显示? ;) 你看到我的问题了 ;D
    • 我现在做;该问题并未定义“可用空间”的含义。
    • 嗯。那就是问题所在。 ;) 假设我有一个标签,它可以将文本缩放到最大可能的大小,还可以缩放宽度以适合文本。所以当高度是限制因素时,不必要的宽度会被剪掉。现在让我们说字体的大小在某个点下降到一个阈值以下。知道标签将被隐藏,直到标签有足够的空间将字体缩放到阈值以上。问题是标签应该如何知道,何时再次查看。当它隐藏时,其他小部件通常会取代它并且不会再次泄露它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2022-08-14
    • 2015-11-02
    相关资源
    最近更新 更多