我想编写一个自定义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。
有什么想法吗? 谢谢!
答案 0 :(得分:0)
正如您所注意到的,如果您在窗口小部件上调用hide(),则无法收到resize事件。既然您无论如何都要自定义类,而不是调用hide(),您可以设置一个类变量来注意它隐藏并重载paintEvent函数,而不是在设置变量时绘制小部件: -
void CustomLabel::paintEvent(QPaintEvent * event)
{
if(m_hideOnMinimum)
return;
QLabel::paintEvent(event);
}
请注意,通过不绘制标签,它将被隐藏,但用户仍然可以与之交互,因此您需要禁用它或重载键盘/鼠标事件。