#pragma once
#include "QLabel"
#include "QObject"
#include "qevent.h"
#include "QLineEdit"
#include "QPushButton"
#include "QFontMetrics"
#include <type_traits> // std::forward
/*
** 根据文本内容及自身大小, 省略右侧文本控件。
*/
template<typename TextWidget>
class ElidedWidget : public TextWidget
{
public:
template<typename... WF>
explicit ElidedWidget(QWidget *parent = nullptr, WF&&... f)
: TextWidget(parent, std::forward<WF>(f)...)
{
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
setText(m_fullText);
}
template<typename... WF>
explicit ElidedWidget(const QString &text, QWidget *parent = nullptr, WF&&... f)
: ElidedWidget(parent, std::forward<WF>(f)...)
{
m_fullText = text;
}
~ElidedWidget() = default;
void setText(const QString& str)
{
m_fullText = str;
QString showText = m_fullText;
if (m_bIsAutoElided)
{
QFontMetrics fm = this->fontMetrics();
auto margin = TextWidget::contentsMargins();
showText = fm.elidedText(m_fullText, Qt::ElideRight, this->width() - margin.left() - margin.right());
}
TextWidget::setText(showText);
}
void setAutoElided(bool isAuto)
{
if (m_bIsAutoElided != isAuto)
{
m_bIsAutoElided = isAuto;
setText(m_fullText);
}
}
QString text() const
{
return m_fullText;
}
QString elidedText() const
{
return TextWidget::text();
}
protected:
virtual void resizeEvent(QResizeEvent *event) override
{
setText(m_fullText);
TextWidget::resizeEvent(event);
}
private:
bool m_bIsAutoElided = true;
QString m_fullText;
};
using ElidedLabel = ElidedWidget<QLabel>;
using ElidedLineEdit = ElidedWidget<QLineEdit>;
using ElidedPushButton = ElidedWidget<QPushButton>;