XSteam/src/sui_title.cpp
JackLee_CN 9246ca7fb6 修复样式错误
修复字体错误
修复设置设置
2024-10-31 12:58:14 +08:00

277 lines
9.1 KiB
C++
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 "sui_title.h"
sui_title::sui_title(QWidget *parent)
: QWidget(parent),
m_menu(nullptr),
s_menu(nullptr),
f_menu(nullptr)
{
m_parent = parent;
m_type=QD_TYPE::QD_EXIT;
// 给成员变量申请内存
m_icon_button = new QPushButton(/*this*/);
m_min_button = new QPushButton(this);
m_max_button = new QPushButton(this);
m_close_button = new QPushButton(this);
// 初始化图标Label
m_icon_button->setFixedSize(35, 35);
m_icon_button->setAutoFillBackground(true);
m_icon_button->setFlat(true);
// 设置按钮的固定大小、图片、取消边框
m_min_button->setIconSize(QSize(25, 25));
m_min_button->setAutoFillBackground(true);
m_min_button->setFlat(true);
//--
m_max_button->setIconSize(QSize(25, 25));
m_max_button->setAutoFillBackground(true);
m_max_button->setFlat(true);
//--
m_close_button->setIconSize(QSize(25, 25));
m_close_button->setAutoFillBackground(true);
m_close_button->setFlat(true);
// 设置窗口部件的名称
setObjectName(tr("sui_title"));
m_icon_button->setObjectName(tr("ico_button"));
m_min_button->setObjectName(tr("min_button"));
m_max_button->setObjectName(tr("max_button"));
m_close_button->setObjectName(tr("close_button"));
// 给按钮设置静态tooltip当鼠标移上去时显示tooltip
m_min_button->setToolTip(tr("最小化"));
m_max_button->setToolTip(tr("最大化"));
m_close_button->setToolTip(tr("关闭"));
// 标题栏布局
m_title_label = new QLabel(this);
m_title_label->setAlignment(Qt::AlignCenter);
m_title_label->setObjectName(tr("HEAD_STR"));
QFont font = m_title_label->font();
font.setPointSize(28);
m_title_label->setFont(font);
m_layout = new QHBoxLayout(this);
m_layout->setAlignment(Qt::AlignCenter);
m_layout->addWidget(m_icon_button);
m_layout->addItem(sparcer_item);
m_layout->addWidget(m_title_label);
m_layout->addItem(sparcer_item);
m_layout->addWidget(m_min_button);
m_layout->addWidget(m_max_button);
m_layout->addWidget(m_close_button);
m_layout->setSpacing(5);
m_layout->setContentsMargins(5, 0, 5, 0);
setFixedHeight(40);
setLayout(m_layout);
set_font_style();
connect_slots();
}
sui_title::~sui_title()
{
}
void sui_title::connect_slots()
{
// 连接三个按钮的信号槽3
connect(m_icon_button, SIGNAL(clicked(bool)), this, SLOT(slots_ico_menu()));
connect(m_min_button, SIGNAL(clicked(bool)), this, SLOT(on_clicked()));
connect(m_max_button, SIGNAL(clicked(bool)), this, SLOT(on_clicked()));
connect(m_close_button, SIGNAL(clicked(bool)), this, SLOT(on_clicked()));
}
void sui_title::slots_ico_menu()
{
m_menu = new QMenu();
// 外观
if (!s_menu)
{
QActionGroup *s_QGroup = new QActionGroup(this);
s_menu = new QMenu(tr("外观设置"));
for (int i = 0; i <= style_table.count() - 1; i++)
{
QString sName = QFileInfo(style_table[i]).baseName();
QAction *s_Action = new QAction(sName, s_QGroup);
s_Action->setObjectName(QString::number(i));
s_Action->setCheckable(true);
if (i == _data.x_config.style)
{
s_Action->setChecked(true);
}
connect(s_Action, SIGNAL(triggered(bool)), this, SLOT(slots_set_style_change()));
s_menu->addAction(s_Action);
}
}
// 字体
if (!f_menu)
{
QActionGroup *f_QGroup = new QActionGroup(this);
f_menu = new QMenu(tr("字体设置"));
for (int i = 0; i <= font_table.count() - 1; i++)
{
QAction *f_Action = new QAction(font_table[i], f_QGroup);
f_Action->setObjectName(QString::number(i));
f_Action->setCheckable(true);
if (i == _data.x_config.font)
{
f_Action->setChecked(true);
}
connect(f_Action, SIGNAL(triggered(bool)), this, SLOT(slots_set_font_change()));
f_menu->addAction(f_Action);
}
QAction *separator = new QAction(nullptr);
separator->setSeparator(true);
f_menu->addAction(separator);
QActionGroup *b_QGroup = new QActionGroup(this);
QAction *b_Action = new QAction("字体加粗", b_QGroup);
b_Action->setObjectName("font_bold");
b_Action->setCheckable(true);
if (_data.x_config.font_bold)
{
b_Action->setChecked(true);
}
connect(b_Action, SIGNAL(triggered(bool)), this, SLOT(slots_set_font_change()));
f_menu->addAction(b_Action);
}
m_menu->addMenu(s_menu);
m_menu->addMenu(f_menu);
m_menu->exec(QCursor::pos());
delete m_menu;
m_menu = nullptr;
}
void sui_title::set_font_style(){
slots_set_style_change();
slots_set_font_change();
}
void sui_title::slots_set_style_change()
{
if (sender() != nullptr)
{
_data.x_config.style = sender()->objectName().toInt();
}
change_style(_data.x_config.style);
}
void sui_title::slots_set_font_change()
{
if (sender() != nullptr)
{
if (sender()->objectName() == "font_bold")
{
if (_data.x_config.font_bold)
{
_data.x_config.font_bold = 0;
((QAction *)sender())->setChecked(false);
}
else
{
_data.x_config.font_bold = 1;
((QAction *)sender())->setChecked(true);
}
}
else
{
_data.x_config.font = sender()->objectName().toInt();
}
}
QFont font;
if (!font_table[_data.x_config.font].isEmpty())
{
font.setFamily(font_table[_data.x_config.font]);
font.setPointSize(10);
if (_data.x_config.font_bold)
{
font.setBold(true);
}
else
{
font.setBold(false);
}
QApplication::setFont(font);
}
else
{
qDebug() << "Failed to load font.";
}
change_style(_data.x_config.style);
}
void sui_title::change_style(int index)
{
_data.x_config.style = index;
QString style = tr(":/res/qss/") + style_table[index];
QFile qss(style);
if (qss.open(QFile::ReadOnly))
{
QString styleSheet = this->styleSheet();
styleSheet += QLatin1String(qss.readAll());
m_parent->setStyleSheet(styleSheet);
}
qss.close();
m_parent->update();
}
// 双击标题栏进行界面的最大化/还原
void sui_title::mouseDoubleClickEvent(QMouseEvent *event)
{
Q_UNUSED(event); // 没有实质性的作用只是用来允许event可以不使用用来避免编译器警告
emit m_max_button->clicked();
}
// 进行最小化、最大化/还原、关闭操作
void sui_title::on_clicked()
{
// QObject::Sender()返回发送信号的对象的指针返回类型为QObject *
QPushButton *pButton = qobject_cast<QPushButton *>(sender());
QWidget *pWindow = this->window(); // 获得标题栏所在的窗口
if (pWindow->isWindow())
{
// 判断发送信号的对象使哪个按钮
if (pButton == m_min_button)
{
pWindow->showMinimized(); // 窗口最小化显示
}
else if (pButton == m_max_button)
{
pWindow->isFullScreen() ? pWindow->showNormal() : pWindow->showFullScreen();
}
else if (pButton == m_close_button)
{
if (m_type == QD_TYPE::QD_CLOSE)
{
emit signals_close();
}
else if (m_type == QD_TYPE::QD_EXIT)
{
xsteam_save_data_write();
QApplication::quit();
}
}
}
}
// 最大化/还原
void sui_title::up_maximize()
{
QWidget *pWindow = this->window(); // 获得标题栏所在的窗口
if (pWindow->isWindow())
{
bool bMaximize = pWindow->isFullScreen(); // 判断窗口是不是最大化状态是则返回true否则返回false
if (bMaximize)
{
// 目前窗口是最大化状态,则最大化/还原的toolTip设置为"Restore"
m_max_button->setToolTip(tr("Restore"));
// 设置按钮的属性名为"maximizeProperty"
m_max_button->setProperty("maximizeProperty", tr("restore"));
}
else
{
// 目前窗口是还原状态,则最大化/还原的toolTip设置为"Maximize"
m_max_button->setToolTip(tr("Maximize"));
// 设置按钮的属性名为"maximizeProperty"
m_max_button->setProperty("maximizeProperty", tr("maximize"));
}
m_max_button->setStyle(QApplication::style());
}
}
void sui_title::set_type(QD_TYPE _type)
{
m_type = _type;
disconnect(m_icon_button, SIGNAL(clicked(bool)), this, SLOT(slots_ico_menu()));
}
void sui_title::set_title(QString str)
{
m_title_label->setText(str);
}