在QLabel中隐藏或裁剪重叠文本?

时间:2014-01-22 13:48:58

标签: c++ linux qt qt4 qlabel

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

| textLabel                    | valueLabel | unitLabel |

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

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

我的问题:当textLabel内的文字太长时,它会覆盖valueLabel

我有办法隐藏或切断重叠的文字吗?我想像你可以为overflow: hidden设置的CSS中的<div>属性,或者类似的东西。我也尝试使用QLineEdit作为工作方式,但似乎没有办法使QLineEdit背景透明。我该如何解决这个问题?提前谢谢!

1 个答案:

答案 0 :(得分:1)

布局中的小部件总是被设置为不重叠,因此我发现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);
}