本地新建文件 ElidedLabel.h
、ElidedLabel.cpp
, 复制代码到文件中, 把 ElidedLabel
当做 QLabel
使用即可.
#ifndef ELIDEDLABEL_H
#define ELIDEDLABEL_H
#include <QLabel>
#include <QObject>
#include <QLabel>
class ElidedLabel : public QLabel
{
Q_OBJECT
using 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);
// }
}