我已經在可以調整大小的小部件中有一個QLabel元素。文本可以溢出邊界,所以我需要使應用程序看起來更加優雅,以便使文本在文本中最後一個完全可見的單詞之後生成省略號(...)。「文本溢出」QLabel在QT中的文本呈現
在HTML/CSS中製作佈局我以前爲此使用text-overflow: ellipsis;
,但對於QT類,我還沒有找到任何關於此的信息。
我已經在可以調整大小的小部件中有一個QLabel元素。文本可以溢出邊界,所以我需要使應用程序看起來更加優雅,以便使文本在文本中最後一個完全可見的單詞之後生成省略號(...)。「文本溢出」QLabel在QT中的文本呈現
在HTML/CSS中製作佈局我以前爲此使用text-overflow: ellipsis;
,但對於QT類,我還沒有找到任何關於此的信息。
它看起來像您的標籤resize event您可以使用小部件的新寬度創建消減文本並重置文本。使用QFontMetrix::elidedText方法來獲取字符串的消隱版本。
QString text("some long text without elipsis");
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText(text, Qt::ElideRight, label->width());
label->setText(elidedText);
希望這會有所幫助,對於上述
我修改的解決方案,並創建了一個功能:
static void SetTextToLabel(QLabel *label, QString text)
{
QFontMetrics metrix(label->font());
int width = label->width() - 2;
QString clippedText = metrix.elidedText(text, Qt::ElideRight, width);
label->setText(clippedText);
}
希望這將是有益的。
實際上幾乎沒有區別,但減去一些寬度確實有一點幫助 –
Qt-5包含一個example of an elided label class,它在實現您自己的時候可能是一個有用的參考。
從例如:
elidedlabel.h:
class ElidedLabel : public QFrame
{
Q_OBJECT
Q_PROPERTY(QString text READ text WRITE setText)
Q_PROPERTY(bool isElided READ isElided)
public:
explicit ElidedLabel(const QString &text, QWidget *parent = 0);
void setText(const QString &text);
const QString & text() const { return content; }
bool isElided() const { return elided; }
protected:
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
signals:
void elisionChanged(bool elided);
private:
bool elided;
QString content;
};
elidedlabel.cpp:
ElidedLabel::ElidedLabel(const QString &text, QWidget *parent)
: QFrame(parent)
, elided(false)
, content(text)
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
}
void ElidedLabel::setText(const QString &newText)
{
content = newText;
update();
}
void ElidedLabel::paintEvent(QPaintEvent *event)
{
QFrame::paintEvent(event);
QPainter painter(this);
QFontMetrics fontMetrics = painter.fontMetrics();
bool didElide = false;
int lineSpacing = fontMetrics.lineSpacing();
int y = 0;
QTextLayout textLayout(content, painter.font());
textLayout.beginLayout();
forever {
QTextLine line = textLayout.createLine();
if (!line.isValid())
break;
line.setLineWidth(width());
int nextLineY = y + lineSpacing;
if (height() >= nextLineY + lineSpacing) {
line.draw(&painter, QPoint(0, y));
y = nextLineY;
//! [2]
//! [3]
} else {
QString lastLine = content.mid(line.textStart());
QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, width());
painter.drawText(QPoint(0, y + fontMetrics.ascent()), elidedLastLine);
line = textLayout.createLine();
didElide = line.isValid();
break;
}
}
textLayout.endLayout();
if (didElide != elided) {
elided = didElide;
emit elisionChanged(didElide);
}
}
也可以考慮重新實現'的minimumSizeHint()'喜歡的東西'返回QSIZE(0, 。QLabel ::的minimumSizeHint()高度());'。否則,標籤不能在原始文本寬度以下調整大小。 – kaveish