改进很多代码

This commit is contained in:
feiyangqingyun
2021-10-30 19:20:24 +08:00
parent cb138c2ec5
commit f027369f27
104 changed files with 842 additions and 348 deletions

View File

@@ -1,41 +0,0 @@
#include "base64helper.h"
#include "qbuffer.h"
#include "qdebug.h"
QString Base64Helper::imageToBase64(const QImage &image)
{
return QString(imageToBase64x(image));
}
QByteArray Base64Helper::imageToBase64x(const QImage &image)
{
//这个转换可能比较耗时建议在线程中执行
QByteArray data;
QBuffer buffer(&data);
image.save(&buffer, "JPG");
data = data.toBase64();
return data;
}
QImage Base64Helper::base64ToImage(const QString &data)
{
return base64ToImagex(data.toUtf8());
}
QImage Base64Helper::base64ToImagex(const QByteArray &data)
{
//这个转换可能比较耗时建议在线程中执行
QImage image;
image.loadFromData(QByteArray::fromBase64(data));
return image;
}
QString Base64Helper::textToBase64(const QString &text)
{
return QString(text.toLocal8Bit().toBase64());
}
QString Base64Helper::base64ToText(const QString &text)
{
return QString(QByteArray::fromBase64(text.toLocal8Bit()));
}

View File

@@ -1,37 +0,0 @@
#ifndef BASE64HELPER_H
#define BASE64HELPER_H
/**
* base64编码转换类 作者:feiyangqingyun(QQ:517216493) 2016-12-16
* 1. 图片转base64字符串。
* 2. base64字符串转图片。
* 3. 字符转base64字符串。
* 4. base64字符串转字符。
* 5. 后期增加数据压缩。
* 6. Qt6对base64编码转换进行了重写效率提升至少200%。
*/
#include <QImage>
#ifdef quc
class Q_DECL_EXPORT Base64Helper
#else
class Base64Helper
#endif
{
public:
//图片转base64字符串
static QString imageToBase64(const QImage &image);
static QByteArray imageToBase64x(const QImage &image);
//base64字符串转图片
static QImage base64ToImage(const QString &data);
static QImage base64ToImagex(const QByteArray &data);
//字符串与base64互转
static QString textToBase64(const QString &text);
static QString base64ToText(const QString &text);
};
#endif // BASE64HELPER_H

View File

@@ -21,7 +21,6 @@ CONFIG += resources_big
include ($$PWD/h3.pri)
HEADERS += \
$$PWD/base64helper.h \
$$PWD/iconhelper.h \
$$PWD/quiconfig.h \
$$PWD/quidateselect.h \
@@ -34,7 +33,6 @@ HEADERS += \
$$PWD/quiwidget.h
SOURCES += \
$$PWD/base64helper.cpp \
$$PWD/iconhelper.cpp \
$$PWD/quiconfig.cpp \
$$PWD/quidateselect.cpp \

View File

@@ -59,5 +59,6 @@
#include "quitipbox.h"
#include "quidateselect.h"
#include "quiinputbox.h"
#include "quiwidget.h"
#endif // QUIHEAD_H

View File

@@ -1372,3 +1372,87 @@ bool QUIHelper::checkRowCount(int rowCount, int maxCount, int warnCount)
return true;
}
QPixmap QUIHelper::getPixmap(QWidget *widget, const QPixmap &pixmap, bool scale)
{
if (pixmap.isNull()) {
return pixmap;
}
//scale=false 超过尺寸才需要等比例缩放
QPixmap pix = pixmap;
if (scale) {
pix = pix.scaled(widget->size() - QSize(2, 2), Qt::KeepAspectRatio, Qt::SmoothTransformation);
} else if (pix.width() > widget->width() || pix.height() > widget->height()) {
pix = pix.scaled(widget->size() - QSize(2, 2), Qt::KeepAspectRatio, Qt::SmoothTransformation);
}
return pix;
}
void QUIHelper::setPixmap(QLabel *label, const QString &file, bool scale)
{
//文件不存在则不用处理
if (!QFile(file).exists()) {
label->clear();
return;
}
QPixmap pixmap(file);
pixmap = getPixmap(label, pixmap);
label->setPixmap(pixmap);
}
void QUIHelper::setLogo(QLabel *label, const QString &file,
int width, int height, int offset,
const QString &oldColor, const QString &newColor)
{
//如果是icon开头则表示图形字体否则取logo图片
if (file.startsWith("icon")) {
//设置图形字体作为logo
height = 55, width = 80;
QString text = file.split("_").last();
int icon = text.toInt(NULL, 16);
IconHelper::setIcon(label, icon, height);
} else {
//区分资源文件和本地文件
QString fileName = file;
if (!file.startsWith(":/")) {
height = 50;
fileName = QString("%1/logo/%2.png").arg(QUIHelper::appPath()).arg(file);
}
//svg图片自动换颜色
if (file.endsWith(".svg")) {
//打开文件对指定颜色进行替换
QFile f(file);
if (f.open(QFile::ReadOnly)) {
QString text = f.readAll();
text.replace(oldColor, newColor);
f.close();
//打开新的文件输出
fileName = QString("%1/logo/temp.svg").arg(QUIHelper::appPath());
QFile f2(fileName);
if (f2.open(QFile::WriteOnly)) {
f2.write(text.toUtf8());
f2.close();
}
}
}
//自动计算宽度比例
QPixmap pixmap(fileName);
width = pixmap.width() / (pixmap.height() / height);
pixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
label->setPixmap(pixmap);
}
//设置logo标签最小宽度
if (width - height < offset) {
width += offset;
}
label->setFixedWidth(width);
label->setAlignment(Qt::AlignCenter);
}

View File

@@ -223,6 +223,14 @@ public:
static void openFile(const QString &fileName, const QString &msg);
//导出和打印数据提示框
static bool checkRowCount(int rowCount, int maxCount, int warnCount);
//获取等比例缩放过的图片
static QPixmap getPixmap(QWidget *widget, const QPixmap &pixmap, bool scale = false);
static void setPixmap(QLabel *label, const QString &file, bool scale = false);
//设置logo图片支持 资源文件+本地图片+图形字体+svg自动变色 等多种形式
static void setLogo(QLabel *label, const QString &file,
int width, int height, int offset = 20,
const QString &oldColor = QString(), const QString &newColor = QString());
};
#endif // QUIHELPER_H

View File

@@ -25,11 +25,25 @@ void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)
styleFiles = files;
}
void QUIStyle::setStyle(const QString &qss, const QString &paletteColor)
void QUIStyle::setStyle(const QString &qss)
{
QStringList list;
list << qss;
//5.12开始tabbar左右反过来的
#if (QT_VERSION >= QT_VERSION_CHECK(5,12,0))
//左右两侧的边框偏移一个像素
list << "QTabWidget::pane:left{left:-1px;right:0px;}";
list << "QTabWidget::pane:right{right:-1px;left:0px;}";
//选中和悬停的时候边缘加深2个像素
list << "QTabBar::tab:left:selected,QTabBar::tab:left:hover{border-width:0px 0px 0px 2px;}";
list << "QTabBar::tab:right:selected,QTabBar::tab:right:hover{border-width:0px 2px 0px 0px;}";
#endif
QUIHelper::isCustomUI = true;
QString paletteColor = qss.mid(20, 7);
qApp->setPalette(QPalette(paletteColor));
qApp->setStyleSheet(qss);
qApp->setStyleSheet(list.join(""));
}
void QUIStyle::setStyle(const QUIStyle::Style &style)
@@ -48,18 +62,18 @@ void QUIStyle::setStyle(const QUIStyle::Style &style)
QString paletteColor = qss.mid(20, 7);
getQssColor(qss, QUIConfig::TextColor, QUIConfig::PanelColor, QUIConfig::BorderColor, QUIConfig::NormalColorStart,
QUIConfig::NormalColorEnd, QUIConfig::DarkColorStart, QUIConfig::DarkColorEnd, QUIConfig::HighColor);
setStyle(qss, paletteColor);
setStyle(qss);
file.close();
}
}
void QUIStyle::setStyle(const QString &qssFile)
void QUIStyle::setStyleFile(const QString &qssFile)
{
QString paletteColor, textColor;
setStyle(qssFile, paletteColor, textColor);
setStyleFile(qssFile, paletteColor, textColor);
}
void QUIStyle::setStyle(const QString &qssFile, QString &paletteColor, QString &textColor)
void QUIStyle::setStyleFile(const QString &qssFile, QString &paletteColor, QString &textColor)
{
QFile file(qssFile);
if (file.open(QFile::ReadOnly)) {
@@ -68,78 +82,49 @@ void QUIStyle::setStyle(const QString &qssFile, QString &paletteColor, QString &
textColor = qss.mid(49, 7);
getQssColor(qss, QUIConfig::TextColor, QUIConfig::PanelColor, QUIConfig::BorderColor, QUIConfig::NormalColorStart,
QUIConfig::NormalColorEnd, QUIConfig::DarkColorStart, QUIConfig::DarkColorEnd, QUIConfig::HighColor);
setStyle(qss, paletteColor);
setStyle(qss);
file.close();
}
}
void QUIStyle::setStyle(const QString &qssFile, QString &textColor, QString &panelColor, QString &borderColor,
QString &normalColorStart, QString &normalColorEnd,
QString &darkColorStart, QString &darkColorEnd, QString &highColor)
void QUIStyle::setStyleFile(const QString &qssFile, QString &textColor, QString &panelColor, QString &borderColor,
QString &normalColorStart, QString &normalColorEnd,
QString &darkColorStart, QString &darkColorEnd, QString &highColor)
{
QFile file(qssFile);
if (file.open(QFile::ReadOnly)) {
QString qss = QLatin1String(file.readAll());
getQssColor(qss, textColor, panelColor, borderColor, normalColorStart, normalColorEnd, darkColorStart, darkColorEnd, highColor);
setStyle(qss, panelColor);
setStyle(qss);
file.close();
}
}
void QUIStyle::getQssColor(const QString &qss, QString &textColor, QString &panelColor, QString &borderColor,
void QUIStyle::getQssColor(const QString &qss, const QString &flag, QString &color)
{
int index = qss.indexOf(flag);
if (index >= 0) {
color = qss.mid(index + flag.length(), 7);
}
//qDebug() << TIMEMS << flag << color;
}
void QUIStyle::getQssColor(const QString &qss, QString &textColor,
QString &panelColor, QString &borderColor,
QString &normalColorStart, QString &normalColorEnd,
QString &darkColorStart, QString &darkColorEnd, QString &highColor)
{
getQssColor(qss, "TextColor:", textColor);
getQssColor(qss, "PanelColor:", panelColor);
getQssColor(qss, "BorderColor:", borderColor);
getQssColor(qss, "NormalColorStart:", normalColorStart);
getQssColor(qss, "NormalColorEnd:", normalColorEnd);
getQssColor(qss, "DarkColorStart:", darkColorStart);
getQssColor(qss, "DarkColorEnd:", darkColorEnd);
getQssColor(qss, "HighColor:", highColor);
QUIHelper::isCustomUI = true;
QString str = qss;
QString flagTextColor = "TextColor:";
int indexTextColor = str.indexOf(flagTextColor);
if (indexTextColor >= 0) {
textColor = str.mid(indexTextColor + flagTextColor.length(), 7);
}
QString flagPanelColor = "PanelColor:";
int indexPanelColor = str.indexOf(flagPanelColor);
if (indexPanelColor >= 0) {
panelColor = str.mid(indexPanelColor + flagPanelColor.length(), 7);
}
QString flagBorderColor = "BorderColor:";
int indexBorderColor = str.indexOf(flagBorderColor);
if (indexBorderColor >= 0) {
borderColor = str.mid(indexBorderColor + flagBorderColor.length(), 7);
}
QString flagNormalColorStart = "NormalColorStart:";
int indexNormalColorStart = str.indexOf(flagNormalColorStart);
if (indexNormalColorStart >= 0) {
normalColorStart = str.mid(indexNormalColorStart + flagNormalColorStart.length(), 7);
}
QString flagNormalColorEnd = "NormalColorEnd:";
int indexNormalColorEnd = str.indexOf(flagNormalColorEnd);
if (indexNormalColorEnd >= 0) {
normalColorEnd = str.mid(indexNormalColorEnd + flagNormalColorEnd.length(), 7);
}
QString flagDarkColorStart = "DarkColorStart:";
int indexDarkColorStart = str.indexOf(flagDarkColorStart);
if (indexDarkColorStart >= 0) {
darkColorStart = str.mid(indexDarkColorStart + flagDarkColorStart.length(), 7);
}
QString flagDarkColorEnd = "DarkColorEnd:";
int indexDarkColorEnd = str.indexOf(flagDarkColorEnd);
if (indexDarkColorEnd >= 0) {
darkColorEnd = str.mid(indexDarkColorEnd + flagDarkColorEnd.length(), 7);
}
QString flagHighColor = "HighColor:";
int indexHighColor = str.indexOf(flagHighColor);
if (indexHighColor >= 0) {
highColor = str.mid(indexHighColor + flagHighColor.length(), 7);
}
QUIConfig::TextColor = textColor;
}
void QUIStyle::setLabStyle(QLabel *lab, quint8 type, const QString &bgColor, const QString &textColor)

View File

@@ -30,17 +30,18 @@ public:
//获取皮肤样式中文名称和对应的样式表文件
static void getStyle(QStringList &styleNames, QStringList &styleFiles);
//设置全局样式
static void setStyle(const QString &qss, const QString &paletteColor);
static void setStyle(const QString &qss);
static void setStyle(const QUIStyle::Style &style);
static void setStyle(const QString &qssFile);
static void setStyle(const QString &qssFile, QString &paletteColor, QString &textColor);
static void setStyle(const QString &qssFile, QString &textColor,
QString &panelColor, QString &borderColor,
QString &normalColorStart, QString &normalColorEnd,
QString &darkColorStart, QString &darkColorEnd,
QString &highColor);
static void setStyleFile(const QString &qssFile);
static void setStyleFile(const QString &qssFile, QString &paletteColor, QString &textColor);
static void setStyleFile(const QString &qssFile, QString &textColor,
QString &panelColor, QString &borderColor,
QString &normalColorStart, QString &normalColorEnd,
QString &darkColorStart, QString &darkColorEnd,
QString &highColor);
//根据QSS样式获取对应颜色值
static void getQssColor(const QString &qss, const QString &flag, QString &color);
static void getQssColor(const QString &qss, QString &textColor,
QString &panelColor, QString &borderColor,
QString &normalColorStart, QString &normalColorEnd,

View File

@@ -3,7 +3,7 @@
QUIWidget::QUIWidget(QWidget *parent) : QDialog(parent)
{
this->initControl();
this->initForm();
this->initForm();
}
QUIWidget::~QUIWidget()
@@ -234,7 +234,7 @@ void QUIWidget::initForm()
setIcon(QUIWidget::BtnMenu_Close, QUIConfig::IconClose);
this->widgetTitle->setProperty("form", "title");
QUIHelper::setFramelessForm(this);
QUIHelper::setFramelessForm(this, false, false, false);
//设置标题及对齐方式
title = "QUI Demo";
@@ -249,24 +249,41 @@ void QUIWidget::initForm()
this->installEventFilter(this);
this->widgetTitle->installEventFilter(this);
//默认切换换肤立即换肤
changedStyle = true;
//添加换肤菜单
QStringList styleNames, styleFiles;
QUIStyle::getStyle(styleNames, styleFiles);
//添加到动作分组中形成互斥效果
actionGroup = new QActionGroup(this);
int count = styleNames.count();
for (int i = 0; i < count; i++) {
QAction *action = new QAction(this);
//设置可选中前面有个勾勾
action->setCheckable(true);
action->setText(styleNames.at(i));
action->setData(styleFiles.at(i));
connect(action, SIGNAL(triggered(bool)), this, SLOT(changeStyle()));
this->btnMenu->addAction(action);
actionGroup->addAction(action);
}
//默认选择一种样式
setQssChecked(":/qss/lightblue.css");
}
void QUIWidget::changeStyle()
{
QAction *action = (QAction *)sender();
QString qssFile = action->data().toString();
QUIStyle::setStyle(qssFile);
//有些应用可能只需要发送个换肤的信号给他就行
if (changedStyle) {
QUIStyle::setStyleFile(qssFile);
}
emit changeStyle(qssFile);
}
@@ -399,6 +416,22 @@ void QUIWidget::setMainWidget(QWidget *mainWidget)
}
}
void QUIWidget::setQssChecked(const QString &qssFile)
{
QList<QAction *> actions = actionGroup->actions();
foreach (QAction *action, actions) {
if (action->data().toString() == qssFile) {
action->setChecked(true);
break;
}
}
}
void QUIWidget::setChangedStyle(bool changedStyle)
{
this->changedStyle = changedStyle;
}
void QUIWidget::on_btnMenu_Min_clicked()
{
if (minHide) {

View File

@@ -42,11 +42,14 @@ private:
QVBoxLayout *verticalLayout3;
private:
QString title; //标题
Qt::Alignment alignment;//标题文本对齐
bool minHide; //最小化隐藏
bool exitAll; //退出整个程序
QWidget *mainWidget; //主窗体对象
QString title; //标题
Qt::Alignment alignment; //标题文本对齐
bool minHide; //最小化隐藏
bool exitAll; //退出整个程序
QWidget *mainWidget; //主窗体对象
bool changedStyle; //切换换肤是否立即换肤
QActionGroup *actionGroup; //换肤菜单动作组
public:
QLabel *getLabIco() const;
@@ -55,7 +58,7 @@ public:
QToolButton *getBtnMenu() const;
QPushButton *getBtnMenuMin() const;
QPushButton *getBtnMenuMax() const;
QPushButton *getBtnMenuClose() const;
QPushButton *getBtnMenuClose() const;
QString getTitle() const;
Qt::Alignment getAlignment() const;
@@ -66,9 +69,9 @@ public:
QSize minimumSizeHint() const;
private slots:
void initControl(); //初始化控件
void initForm(); //初始化窗体
void changeStyle(); //更换样式
void initControl(); //初始化控件
void initForm(); //初始化窗体
void changeStyle(); //更换样式
private slots:
void on_btnMenu_Min_clicked();
@@ -104,6 +107,11 @@ public Q_SLOTS:
//设置主窗体
void setMainWidget(QWidget *mainWidget);
//设置默认选中的换肤菜单
void setQssChecked(const QString &qssFile);
//设置切换换肤是否立即换肤
void setChangedStyle(bool changedStyle);
Q_SIGNALS:
void changeStyle(const QString &qssFile);
void closing();

Binary file not shown.

View File

@@ -2,5 +2,6 @@
<qresource prefix="/">
<file>image/fontawesome-webfont.ttf</file>
<file>image/iconfont.ttf</file>
<file>image/pe-icon-set-weather.ttf</file>
</qresource>
</RCC>