本地新建文件 ElidedLabel.hElidedLabel.cpp, 复制代码到文件中, 把 ElidedLabel 当做 QLabel 使用即可.

    1. #ifndef ELIDEDLABEL_H
    2. #define ELIDEDLABEL_H
    3. #include <QLabel>
    4. #include <QObject>
    5. #include <QLabel>
    6. class ElidedLabel : public QLabel
    7. {
    8. Q_OBJECT
    9. using QLabel::QLabel;
    10. public:
    11. explicit ElidedLabel(QWidget *parent=nullptr);
    12. // Set the elide mode used for displaying text.
    13. void setElideMode(Qt::TextElideMode elideMode);
    14. // Get the elide mode currently used to display text.
    15. Qt::TextElideMode elideMode() const { return m_elideMode; }
    16. protected:
    17. void paintEvent(QPaintEvent *e) override;
    18. void resizeEvent(QResizeEvent *e) override;
    19. private:
    20. void updateCachedTexts();
    21. private:
    22. Qt::TextElideMode m_elideMode = Qt::ElideRight;
    23. QString m_cachedElidedText;
    24. QString m_cachedText;
    25. };
    26. #endif // ELIDEDLABEL_H
    1. #include "ElidedLabel.h"
    2. ElidedLabel::ElidedLabel(QWidget *parent)
    3. : QLabel(parent)
    4. {
    5. }
    6. void ElidedLabel::setElideMode(Qt::TextElideMode elideMode)
    7. {
    8. m_elideMode = elideMode;
    9. m_cachedText.clear();
    10. update();
    11. }
    12. void ElidedLabel::paintEvent(QPaintEvent *e)
    13. {
    14. if (m_elideMode == Qt::ElideNone)
    15. return QLabel::paintEvent(e);
    16. updateCachedTexts();
    17. QLabel::setText(m_cachedElidedText);
    18. QLabel::paintEvent(e);
    19. QLabel::setText(m_cachedText);
    20. }
    21. void ElidedLabel::resizeEvent(QResizeEvent *e)
    22. {
    23. QLabel::resizeEvent(e);
    24. m_cachedText.clear();
    25. }
    26. void ElidedLabel::updateCachedTexts()
    27. {
    28. // setText() is not virtual ... :/
    29. const auto txt = text();
    30. if (m_cachedText == txt)
    31. return;
    32. m_cachedText = txt;
    33. const QFontMetrics fm(fontMetrics());
    34. m_cachedElidedText = fm.elidedText(text(),
    35. m_elideMode,
    36. width(),
    37. Qt::TextShowMnemonic);
    38. // make sure to show at least the first character
    39. // if (!m_cachedText.isEmpty())
    40. // {
    41. // const QString showFirstCharacter = m_cachedText.at(0) + QStringLiteral("...");
    42. // setMinimumWidth(fm.horizontalAdvance(showFirstCharacter) + 1);
    43. // }
    44. }

    代码来源:https://wiki.qt.io/Elided_Label