236 lines
7.3 KiB
C++
Executable File
236 lines
7.3 KiB
C++
Executable File
#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);
|
||
//}
|