本地新建文件 ElidedLabel.h、ElidedLabel.cpp, 复制代码到文件中, 把 ElidedLabel 当做 QLabel 使用即可.
#ifndef ELIDEDLABEL_H#define ELIDEDLABEL_H#include <QLabel>#include <QObject>#include <QLabel>class ElidedLabel : public QLabel{Q_OBJECTusing QLabel::QLabel;public:explicit ElidedLabel(QWidget *parent=nullptr);// Set the elide mode used for displaying text.void setElideMode(Qt::TextElideMode elideMode);// Get the elide mode currently used to display text.Qt::TextElideMode elideMode() const { return m_elideMode; }protected:void paintEvent(QPaintEvent *e) override;void resizeEvent(QResizeEvent *e) override;private:void updateCachedTexts();private:Qt::TextElideMode m_elideMode = Qt::ElideRight;QString m_cachedElidedText;QString m_cachedText;};#endif // ELIDEDLABEL_H
#include "ElidedLabel.h"ElidedLabel::ElidedLabel(QWidget *parent): QLabel(parent){}void ElidedLabel::setElideMode(Qt::TextElideMode elideMode){m_elideMode = elideMode;m_cachedText.clear();update();}void ElidedLabel::paintEvent(QPaintEvent *e){if (m_elideMode == Qt::ElideNone)return QLabel::paintEvent(e);updateCachedTexts();QLabel::setText(m_cachedElidedText);QLabel::paintEvent(e);QLabel::setText(m_cachedText);}void ElidedLabel::resizeEvent(QResizeEvent *e){QLabel::resizeEvent(e);m_cachedText.clear();}void ElidedLabel::updateCachedTexts(){// setText() is not virtual ... :/const auto txt = text();if (m_cachedText == txt)return;m_cachedText = txt;const QFontMetrics fm(fontMetrics());m_cachedElidedText = fm.elidedText(text(),m_elideMode,width(),Qt::TextShowMnemonic);// make sure to show at least the first character// if (!m_cachedText.isEmpty())// {// const QString showFirstCharacter = m_cachedText.at(0) + QStringLiteral("...");// setMinimumWidth(fm.horizontalAdvance(showFirstCharacter) + 1);// }}
