我目前正在构建一个UI,其中我确实有3个在水平布局中排列的标签:
| textLabel | valueLabel | unitLabel |
valueLabel
和unitLabel
正确对齐。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);
}