yhkylin-backup-tools/kybackup/component/mylabel.cpp

236 lines
7.3 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
//}