236 lines
7.3 KiB
C++
236 lines
7.3 KiB
C++
|
#include "mylabel.h"
|
|||
|
#include <QPalette>
|
|||
|
#include <QFont>
|
|||
|
#include <QFontMetrics>
|
|||
|
#include <QPainter>
|
|||
|
#include "../../common/mydefine.h"
|
|||
|
#include "../globalbackupinfo.h"
|
|||
|
#include "../gsettingswrapper.h"
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 通用构造Label方法
|
|||
|
* @param parent
|
|||
|
*/
|
|||
|
MyLabel::MyLabel(QWidget* parent) :
|
|||
|
QLabel(parent),
|
|||
|
m_bAutoTheme(true)
|
|||
|
{
|
|||
|
connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) {
|
|||
|
// 只有黑白两色手动跟随主题,其它颜色不需要程序员手动设置(自动即可)
|
|||
|
if (!m_bAutoTheme) {
|
|||
|
if (isDark) {
|
|||
|
this->setFontColor(Qt::white);
|
|||
|
} else {
|
|||
|
this->setFontColor(Qt::black);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
// 主题模块已经将QLabel改为了跟随主题设置,这里暂时去掉
|
|||
|
// connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::fontChanged, this, [=]() {
|
|||
|
// // 字体家族、大小变化需重绘,并且字体大小变化也可能会造成显示不全问题
|
|||
|
// if (this->wordWrap()) {
|
|||
|
// this->setText(m_text);
|
|||
|
// } else {
|
|||
|
// QFontMetrics fontMetrics(this->font());
|
|||
|
// int fontSize = fontMetrics.width(m_text);
|
|||
|
// if (fontSize > this->width()) {
|
|||
|
// this->setText(fontMetrics.elidedText(m_text, Qt::ElideRight, this->width()));
|
|||
|
// } else {
|
|||
|
// this->setText(m_text);
|
|||
|
// }
|
|||
|
// }
|
|||
|
// });
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 构造固定大小、颜色、内容居中等的label,一般用于label控件不会变化重绘的场景
|
|||
|
* @param text
|
|||
|
* @param parent
|
|||
|
* @param align
|
|||
|
*/
|
|||
|
MyLabel::MyLabel(const QString& text, QWidget* parent /*= nullptr*/, Qt::Alignment align /*= Qt::AlignCenter*/) :
|
|||
|
QLabel(parent),
|
|||
|
m_text(text),
|
|||
|
m_bAutoTheme(true)
|
|||
|
{
|
|||
|
this->setAlignment(align);
|
|||
|
this->setDeplayText(text);
|
|||
|
this->setScaledContents(true);
|
|||
|
|
|||
|
connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) {
|
|||
|
// 只有黑白两色手动跟随主题,其它颜色不需要程序员手动设置(自动即可)
|
|||
|
if (!this->m_bAutoTheme) {
|
|||
|
if (isDark) {
|
|||
|
this->setFontColor(Qt::white);
|
|||
|
} else {
|
|||
|
this->setFontColor(Qt::black);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
// 主题模块已经将QLabel改为了跟随主题设置,这里暂时去掉
|
|||
|
// connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::fontChanged, this, [=]() {
|
|||
|
// // 字体家族、大小变化需重绘,并且字体大小变化也可能会造成显示不全问题
|
|||
|
// if (this->wordWrap()) {
|
|||
|
// this->setText(m_text);
|
|||
|
// } else {
|
|||
|
// QFontMetrics fontMetrics(this->font());
|
|||
|
// int fontSize = fontMetrics.width(m_text);
|
|||
|
// if (fontSize > this->width()) {
|
|||
|
// this->setText(fontMetrics.elidedText(m_text, Qt::ElideRight, this->width()));
|
|||
|
// } else {
|
|||
|
// this->setText(m_text);
|
|||
|
// }
|
|||
|
// }
|
|||
|
// });
|
|||
|
}
|
|||
|
|
|||
|
MyLabel::~MyLabel()
|
|||
|
{}
|
|||
|
|
|||
|
void MyLabel::setMaxLenText()
|
|||
|
{
|
|||
|
QFontMetrics fontMetrics(this->font());
|
|||
|
int fontSize = fontMetrics.width(this->m_text);
|
|||
|
if (this->m_maxWidth > 0 && fontSize >= this->m_maxWidth) {
|
|||
|
this->setFixedWidth(this->m_maxWidth);
|
|||
|
this->setWordWrap(true);
|
|||
|
} else {
|
|||
|
this->setFixedWidth(fontSize);
|
|||
|
}
|
|||
|
this->setText(this->m_text);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置显示文本,根据字体自动设置控件宽度,并限制最大宽度;超过长度换行展示;
|
|||
|
* @param text
|
|||
|
* @param length 最大宽度
|
|||
|
*/
|
|||
|
void MyLabel::setMaxLenText(const QString& text, int width)
|
|||
|
{
|
|||
|
m_text = text;
|
|||
|
m_maxWidth = width;
|
|||
|
setMaxLenText();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 如果文本超长则显示省略号,不超长正常显示
|
|||
|
* @param text
|
|||
|
* @note 调用此方法前必须先设置label固定大小或最小及其大小策略
|
|||
|
*/
|
|||
|
void MyLabel::setElidedText(const QString& text, Qt::TextElideMode mode/* = Qt::ElideRight*/)
|
|||
|
{
|
|||
|
m_text = text;
|
|||
|
QFontMetrics fontMetrics(this->font());
|
|||
|
int fontSize = fontMetrics.width(m_text);
|
|||
|
if (fontSize > this->width()) {
|
|||
|
this->setText(fontMetrics.elidedText(m_text, mode, this->width()));
|
|||
|
} else {
|
|||
|
this->setText(m_text);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置字体颜色,建议颜色使用Qt::black这种模式的
|
|||
|
* @param color
|
|||
|
*/
|
|||
|
void MyLabel::setFontColor(QColor color)
|
|||
|
{
|
|||
|
// 只有黑白两色手动跟随主题,其它颜色不需要程序员手动设置(自动即可)
|
|||
|
if (color == QColor(Qt::black)) {
|
|||
|
m_bAutoTheme = false;
|
|||
|
if (g_GSettingWrapper.isDarkTheme()) {
|
|||
|
color = QColor(Qt::white);
|
|||
|
}
|
|||
|
} else if (color == QColor(Qt::white)) {
|
|||
|
m_bAutoTheme = false;
|
|||
|
if (!g_GSettingWrapper.isDarkTheme()) {
|
|||
|
color = QColor(Qt::black);
|
|||
|
}
|
|||
|
} else {
|
|||
|
m_bAutoTheme = true;
|
|||
|
}
|
|||
|
m_fontColor = color;
|
|||
|
|
|||
|
QPalette palette = this->palette();
|
|||
|
if (m_fontColor == QColor(COLOR_BLUE)) {
|
|||
|
palette.setColor(QPalette::WindowText, palette.highlight().color());
|
|||
|
|
|||
|
connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::themeColorChanged, this, [=]() {
|
|||
|
// 强调色更换,高亮等颜色已经改变,所以要重新加载图标。
|
|||
|
QPalette pal(this->palette());
|
|||
|
pal.setColor(QPalette::WindowText, this->palette().highlight().color());
|
|||
|
this->setPalette(pal);
|
|||
|
});
|
|||
|
} else {
|
|||
|
palette.setColor(QPalette::WindowText, color);
|
|||
|
}
|
|||
|
this->setPalette(palette);
|
|||
|
}
|
|||
|
|
|||
|
void MyLabel::setFontSize(int size)
|
|||
|
{
|
|||
|
QFont font = this->font();
|
|||
|
font.setPixelSize(size);
|
|||
|
// 默认为大字体粗体显示
|
|||
|
if (size > 20)
|
|||
|
font.setBold(true);
|
|||
|
this->setFont(font);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置字体是否自动换行展示
|
|||
|
* @param on
|
|||
|
* @note 一般用于setGeometry固定label位置和大小的场景
|
|||
|
*/
|
|||
|
void MyLabel::setFontWordWrap(bool on)
|
|||
|
{
|
|||
|
m_bWordWrap = on;
|
|||
|
setWordWrap(on);
|
|||
|
m_width = this->width();
|
|||
|
m_height = this->height();
|
|||
|
m_rect = geometry();
|
|||
|
}
|
|||
|
|
|||
|
//void MyLabel::paintEvent(QPaintEvent *event)
|
|||
|
//{
|
|||
|
// // 1、场景一:布局动态变化场景,使用原始的QLabel绘制
|
|||
|
// if (m_isOriginal) {
|
|||
|
// this->setText(m_text);
|
|||
|
// QLabel::paintEvent(event);
|
|||
|
|
|||
|
// return ;
|
|||
|
// }
|
|||
|
|
|||
|
// // 2、场景二:setGeometry固定label位置和大小的场景
|
|||
|
// QFontMetrics fontMetrics(this->font());
|
|||
|
// int fontSize = fontMetrics.width(m_text);
|
|||
|
// if (m_bWordWrap && m_width > 0) {
|
|||
|
// // resize(m_width, m_height);
|
|||
|
// // setGeometry(m_rect);
|
|||
|
// // 恢复控件宽度,如果不固定宽度则换行位置不好控制
|
|||
|
// this->setFixedWidth(m_width);
|
|||
|
// }
|
|||
|
|
|||
|
// if (fontSize > this->width()) {
|
|||
|
// if (m_bWordWrap) {
|
|||
|
// // 调整控件大小
|
|||
|
// adjustSize();
|
|||
|
// setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
|||
|
// this->setText(m_text);
|
|||
|
// } else {
|
|||
|
// this->setText(fontMetrics.elidedText(m_text, Qt::ElideRight, this->width()));
|
|||
|
// }
|
|||
|
// } else {
|
|||
|
// if (m_bWordWrap) {
|
|||
|
// // 恢复控件大小及位置
|
|||
|
// setGeometry(m_rect);
|
|||
|
// setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
|
|||
|
// }
|
|||
|
// this->setText(m_text);
|
|||
|
// }
|
|||
|
|
|||
|
// QLabel::paintEvent(event);
|
|||
|
//}
|