QLabel文本超出显示区域显示...

         阅读(726)  2017-06-13 09:07:20

这个功能很有用,默认情况下文本超出长度会被直接截断的,给用户体验很不好。这里截断后会显示...,并且鼠标划上去有tooltip。

#ifndef ELIDEDLABEL_H
#define ELIDEDLABEL_H

#include <QtWidgets/QFrame>
#include <QtCore/QRect>
#include <QtGui/QResizeEvent>
#include <QtCore/QString>
#include <QtWidgets/QWidget>

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) override;

private:
	bool elided;
	QString content;
};

#endif // TEXTWRAPPINGWIDGET_H


#include "elidedlabel.h"

#include <QPainter>
#include <QTextLayout>
#include <QDebug>

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 = 3;

	QTextLayout textLayout(content, painter.font());
	textLayout.beginLayout();
	forever{
		QTextLine line = textLayout.createLine();

		if (!line.isValid())
			break;

		line.setLineWidth(width());
		int nextLineY = y + lineSpacing;

		// 只处理单行
		if (0 && height() >= nextLineY + lineSpacing) {
			line.draw(&painter, QPoint(0, y));
			y = nextLineY;
		} 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 = (lastLine != elidedLastLine);
			break;
		}
	}
	textLayout.endLayout();

	if (didElide) {
		elided = didElide;
	}
	this->setToolTip(didElide ? content : "");
}

文章评论

Keep it simple,stupid
文章数
283
总访问量
260068
今日访问
398
最近评论

ningto : 请到next.ningto.com里发表评论。
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部