Скрыть или обрезать перекрывающийся текст в QLabel?

В настоящее время я создаю пользовательский интерфейс, в котором у меня есть 3 метки, которые расположены в горизонтальном макете:

| textLabel                    | valueLabel | unitLabel |

valueLabel а также unitLabel выровнены вправо. unitLabel имеет фиксированную ширину, valueLabelШирина является переменной и зависит от длины текста внутри него. textLabel выравнивается по левому краю и заполняет оставшееся горизонтальное пространство вплоть до valueLabel,

Итак, другими словами, textLabelширина не является фиксированной, но зависит от ширины valueLabel,

Моя проблема: когда текст внутри textLabel становится слишком длинным, он перекрывает valueLabel,

Есть ли способ скрыть или обрезать перекрывающийся текст? Я думаю о чем-то вроде overflow: hidden атрибут в CSS, который вы можете установить для <div>или что-то подобное. Я также попытался использовать QLineEdit в качестве временного решения, но, похоже, нет способа сделать фон QLineEdit прозрачным. Как я могу решить эту проблему? Заранее спасибо!

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);
}
Другие вопросы по тегам