我目前正在构建一个UI,其中我有3个以水平布局排列的标签:
| textLabel | valueLabel | unitLabel |
valueLabel
和unitLabel
对齐。 unitLabel
具有固定的宽度,valueLabel
的宽度是可变的,取决于其中的文本长度。 textLabel
左对齐并填充剩余的水平空间,直到valueLabel
。
因此,换句话说,textLabel
的宽度不固定,但取决于valueLabel
的宽度。
我的问题:当textLabel
内的文字太长时,它会覆盖valueLabel
。
我有办法隐藏或切断重叠的文字吗?我想像你可以为overflow: hidden
设置的CSS中的<div>
属性,或者类似的东西。我也尝试使用QLineEdit作为工作方式,但似乎没有办法使QLineEdit背景透明。我该如何解决这个问题?提前谢谢!
答案 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);
}