在Qlabel中隐藏或裁剪重叠的文本



我目前正在构建一个UI,其中我确实有3个在水平布局中排列的标签:

| textLabel                    | valueLabel | unitLabel |

valueLabelunitLabel正确对齐。unitLabel具有固定宽度,valueLabel的宽度是可变的,取决于其内部的文本长度。textLabel向左对齐,并填充剩余的水平空间直至valueLabel

因此,换句话说,textLabel的宽度不是固定的,而取决于valueLabel的宽度。

我的问题:当textLabel中的文本太长时,它覆盖了valueLabel

ist有一种方法可以隐藏或切断重叠的文本?我想到类似于CSS中的overflow: hidden属性,您可以为<div>设置或类似的东西。我还试图将Qlineedit用作解决方案,但似乎无法使Qlineedit背景透明。如何解决这个问题?预先感谢!

布局中的小部件总是管理不重叠的,因此我认为textLabel无法重叠valueLabel。即使将其添加到布局中,您的小部件很可能不会由布局管理。也许带有标签的布局不是另一个布局的孩子,也不是在容器小部件上设置的。

您不是在告诉我们一些事情。一个独立的测试案例会很好。

如果您想通过使用" ..."来完成文本的标签,而不是突然将其切断,则可以使用以下样式。

// Usage:
/*
   QApplication app;
   app.setStyle(new ElidedStyle);
   ...
   QWidget * w = new QLabel("Hello World!");
   w->setProperty("elidedItemText", true); 
*/
// Interface
class ElidedStyle : public QProxyStyle
{
public:
   static QString elidedText(const QString & text, QPainter * painter, const QRect & rect);
   virtual void drawItemText(
      QPainter * painter, const QRect & rect, int flags, const QPalette & pal, 
      bool enabled, const QString & text, QPalette::ColorRole textRole = QPalette::NoRole) const Q_DECL_OVERRIDE;
};
// Implementation
QString ElidedStyle::elidedText(const QString & text, QPainter * painter, const QRect & rect)
{
   QWidget * widget = dynamic_cast<QWidget*>(painter->device());
   if (widget && widget->property("elidedItemText").toBool()) {
      QFontMetrics fm(painter->font());
      return fm.elidedText(text, Qt::ElideMiddle, rect.width());
   }
   return text;
}
void ElidedStyle::drawItemText(
   QPainter * painter, const QRect & rect, int flags, const QPalette & pal,
   bool enabled, const QString & text, QPalette::ColorRole textRole) const
{
   QProxyStyle::drawItemText(painter, rect, flags, pal, enabled, elidedText(text, painter, rect), textRole);
}

最新更新