From 8eb83d9cbf70e9932fd8542a204371c075d4a7d6 Mon Sep 17 00:00:00 2001 From: brige Date: Fri, 21 Nov 2025 01:02:44 +0800 Subject: [PATCH] add font setting dailog --- src/common/RecourceHelper.cpp | 24 +++ src/common/RecourceHelper.h | 8 + src/main.cpp | 22 ++- src/ui/Layout/CodeEdtUI.cpp | 7 +- src/ui/Menu/SystemManagerMenu.cpp | 45 ++++- src/ui/Menu/SystemManagerMenu.h | 3 + src/ui/ModelBrowser/PresetModelListWidget.cpp | 7 +- src/ui/Panel/PolarPanel.cpp | 40 +++-- src/ui/Setting/FontSettingDialog.cpp | 138 ++++++++++++++++ src/ui/Setting/FontSettingDialog.h | 21 +++ src/ui/Setting/FontSettingDialog.ui | 156 ++++++++++++++++++ src/ui/WorkSpace/AddTableFileDlg.cpp | 8 +- 12 files changed, 450 insertions(+), 29 deletions(-) create mode 100644 src/ui/Setting/FontSettingDialog.cpp create mode 100644 src/ui/Setting/FontSettingDialog.h create mode 100644 src/ui/Setting/FontSettingDialog.ui diff --git a/src/common/RecourceHelper.cpp b/src/common/RecourceHelper.cpp index 32d1f783..37ffc277 100644 --- a/src/common/RecourceHelper.cpp +++ b/src/common/RecourceHelper.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "config.h" #include "common/SpdLogger.h" @@ -54,6 +55,16 @@ const QString RecourceHelper::GetResourcesPath() const { return QApplication::applicationDirPath() + "/resources"; } +const QString RecourceHelper::GetUiConfigPath() const { +#if _DEBUG + const QString iniFile = QString("%1config/ui.ini").arg(QString(CONFIG_PATH)); +#else + const QString appDirPath = QApplication::applicationDirPath(); + const QString iniFile = QString("%1/config/ui.ini").arg(appDirPath); +#endif + return iniFile; +} + void RecourceHelper::ChangeSkin(const QString& skin) { #if _DEBUG const QString qssFile = QString("%1skin/%2.qss").arg(QString(CONFIG_PATH)).arg(skin); @@ -104,3 +115,16 @@ void RecourceHelper::Init() { } } + +void RecourceHelper::EmitFontChanged() { + emit FontChanged(); +} + +void RecourceHelper::ApplyGlobalFont(const QFont& f) { + qApp->setFont(f); + const QWidgetList widgets = QApplication::allWidgets(); + for (QWidget* w : widgets) { + if (w) w->setFont(f); + } + EmitFontChanged(); +} diff --git a/src/common/RecourceHelper.h b/src/common/RecourceHelper.h index b2bd42a6..76317453 100644 --- a/src/common/RecourceHelper.h +++ b/src/common/RecourceHelper.h @@ -27,6 +27,14 @@ public: const QString GetBasePath() const; const QString GetResourcesPath() const; + const QString GetUiConfigPath() const; + +signals: + void FontChanged(); + +public: + void EmitFontChanged(); + void ApplyGlobalFont(const QFont& f); private: void Init(); diff --git a/src/main.cpp b/src/main.cpp index 31ec7687..2eb46d5f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,9 @@ #include #include #include +#include +#include +#include #include "common/SpdLogger.h" #include "common/RecourceHelper.h" @@ -32,7 +35,6 @@ int main(int argc, char* argv[]) { app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); InstallCrashHandler(); - //字体高分屏自适应 const float DEFAULT_DPI = 96.0; HDC screen = GetDC(NULL); FLOAT dpiX = static_cast(GetDeviceCaps(screen, LOGPIXELSX)); @@ -40,8 +42,22 @@ int main(int argc, char* argv[]) { float fontSize = dpiX / DEFAULT_DPI; QFont font = app.font(); - font.setPointSize(font.pointSize()*fontSize); - app.setFont(font); + const QString uiIni = RecourceHelper::Get().GetUiConfigPath(); + QSettings uiSettings(uiIni, QSettings::IniFormat); + double userScale = uiSettings.value("ui/fontScale", 1.0).toDouble(); + QString fam = uiSettings.value("ui/fontFamily", font.family()).toString(); + QString sty = uiSettings.value("ui/fontStyle", QString()).toString(); + bool italic = uiSettings.value("ui/italic", font.italic()).toBool(); + double basePt = uiSettings.value("ui/basePointSize", 0.0).toDouble(); + if (basePt <= 0.0) basePt = QFontInfo(font).pointSizeF(); + QFontDatabase db; + QFont cfgFont = db.font(fam, sty, static_cast(basePt)); + cfgFont.setItalic(italic); + int cssWeight = uiSettings.value("ui/fontWeight", cfgFont.bold() ? 700 : 400).toInt(); + int qtW = (cssWeight < 150 ? QFont::Thin : cssWeight < 250 ? QFont::ExtraLight : cssWeight < 350 ? QFont::Light : cssWeight < 450 ? QFont::Normal : cssWeight < 550 ? QFont::Medium : cssWeight < 650 ? QFont::DemiBold : cssWeight < 750 ? QFont::Bold : cssWeight < 850 ? QFont::ExtraBold : QFont::Black); + cfgFont.setWeight(qtW); + cfgFont.setPointSizeF(basePt * fontSize * userScale); + RecourceHelper::Get().ApplyGlobalFont(cfgFont); // Single-instance guard to avoid multiple launches from repeated clicks const QString lockPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/Dyt_app.lock"; diff --git a/src/ui/Layout/CodeEdtUI.cpp b/src/ui/Layout/CodeEdtUI.cpp index c15670b9..0b36c60d 100644 --- a/src/ui/Layout/CodeEdtUI.cpp +++ b/src/ui/Layout/CodeEdtUI.cpp @@ -27,13 +27,14 @@ CodeEdtUI::CodeEdtUI(QWidget *parent) editor = new QPlainTextEdit(this); - QFont serifFont("Times", 20, QFont::Bold); - editor->setFont(serifFont); - syntaxHighlighter = new SyntaxHighlighter(editor->document()); setCentralWidget(editor); + connect(&RecourceHelper::Get(), &RecourceHelper::FontChanged, this, [this]() { + editor->setFont(qApp->font()); + }); + InitBat(); diff --git a/src/ui/Menu/SystemManagerMenu.cpp b/src/ui/Menu/SystemManagerMenu.cpp index 6542103a..159de33c 100644 --- a/src/ui/Menu/SystemManagerMenu.cpp +++ b/src/ui/Menu/SystemManagerMenu.cpp @@ -1,6 +1,12 @@ #include "SystemManagerMenu.h" #include +#include +#include +#include +#include +#include +#include #include "common/SpdLogger.h" #include "ui/MainFrame.h" @@ -8,6 +14,9 @@ #include "workspace/WorkSpaceManager.h" #include "workspace/WorkSpace.h" +#include "common/RecourceHelper.h" +#include "ui/Setting/FontSettingDialog.h" + #include "ui_SystemManagerMenu.h" SystemManagerMenu::SystemManagerMenu(QWidget* parent) @@ -19,7 +28,7 @@ SystemManagerMenu::SystemManagerMenu(QWidget* parent) LOG_INFO("SystemManagerMenu init"); windowManagerMenu_ = new QMenu(this); windowManagerMenu_->setWindowFlags(windowManagerMenu_->windowFlags() | Qt::FramelessWindowHint); - ui->menu_uisetting->setVisible(false); + ui->menu_uisetting->setVisible(true); // When workspace changes, clear and rebuild window manager menu connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, @@ -100,7 +109,7 @@ void SystemManagerMenu::InitConnect() { //ui->menu_window_manager->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->menu_window_manager, &QToolButton::clicked, this, &SystemManagerMenu::OnWindowManagerMenu); - connect(ui->menu_uisetting, &QToolButton::clicked, this, &SystemManagerMenu::signalShowUISetting); + connect(ui->menu_uisetting, &QToolButton::clicked, this, &SystemManagerMenu::OnUiSetting); } void SystemManagerMenu::OnExit() { @@ -132,6 +141,38 @@ void SystemManagerMenu::OnWindowManagerMenu() { windowManagerMenu_->exec(QCursor::pos()); } +void SystemManagerMenu::OnUiSetting() { + FontSettingDialog dlg(this); + dlg.exec(); +} + +void SystemManagerMenu::AdjustFontScale(double delta) { + /* const QString uiIni = RecourceHelper::Get().GetUiConfigPath(); + QFileInfo fi(uiIni); + QDir().mkpath(fi.dir().path()); + QSettings uiSettings(uiIni, QSettings::IniFormat); + double curScale = uiSettings.value("ui/fontScale", 1.0).toDouble(); + double newScale = std::clamp(curScale + delta, 0.75, 2.0); + ApplyFontScale(newScale);*/ +} + +void SystemManagerMenu::ApplyFontScale(double newScale) { + /*const QString uiIni = RecourceHelper::Get().GetUiConfigPath(); + QFileInfo fi(uiIni); + QDir().mkpath(fi.dir().path()); + QSettings uiSettings(uiIni, QSettings::IniFormat); + double oldScale = uiSettings.value("ui/fontScale", 1.0).toDouble(); + + QFont f = qApp->font(); + const double currentPt = QFontInfo(f).pointSizeF(); + const double baseScaledPt = (oldScale > 0.0) ? (currentPt / oldScale) : currentPt; + f.setPointSizeF(baseScaledPt * newScale); + qApp->setFont(f); + + uiSettings.setValue("ui/fontScale", newScale); + uiSettings.sync();*/ +} + void SystemManagerMenu::ReloadWindowManagerMenu() { if (!windowManagerMenu_) return; diff --git a/src/ui/Menu/SystemManagerMenu.h b/src/ui/Menu/SystemManagerMenu.h index bfddb817..8c7fb2f8 100644 --- a/src/ui/Menu/SystemManagerMenu.h +++ b/src/ui/Menu/SystemManagerMenu.h @@ -29,6 +29,9 @@ private: void OnExit(); void OnWindowManagerMenu(); void ReloadWindowManagerMenu(); + void OnUiSetting(); + void AdjustFontScale(double delta); + void ApplyFontScale(double newScale); private slots: void OnWorkspaceChanged(class WorkSpace* ws); diff --git a/src/ui/ModelBrowser/PresetModelListWidget.cpp b/src/ui/ModelBrowser/PresetModelListWidget.cpp index c79632ca..dfc1b08e 100644 --- a/src/ui/ModelBrowser/PresetModelListWidget.cpp +++ b/src/ui/ModelBrowser/PresetModelListWidget.cpp @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include #include "common/RecourceHelper.h" #include "common/SpdLogger.h" @@ -79,7 +82,9 @@ void PresetModelListWidget::startDrag(Qt::DropActions supportedActions) { // Draw text below the icon painter.setPen(Qt::black); QFont font = painter.font(); - font.setPointSize(8); + double basePt = QFontInfo(qApp->font()).pointSizeF(); + if (basePt <= 0.0) basePt = 8.0; + font.setPointSizeF(std::max(6.0, basePt * 0.85)); painter.setFont(font); QRect textRect(0, iconSize + 5, totalWidth, textHeight); diff --git a/src/ui/Panel/PolarPanel.cpp b/src/ui/Panel/PolarPanel.cpp index 86f3acb8..bb00cf25 100644 --- a/src/ui/Panel/PolarPanel.cpp +++ b/src/ui/Panel/PolarPanel.cpp @@ -2,6 +2,8 @@ #include "ui/DockWidget.h" #include "ui/DockTitleBar.h" #include "common/SpdLogger.h" +#include "common/RecourceHelper.h" +#include #include #include #include @@ -68,27 +70,27 @@ void PolarPanel::RefreshPanel() void PolarPanel::InitUI() { - m_pChart = new QPolarChart(); + m_pChart = new QPolarChart(); //mPolarChart->addSeries(mCurveData); //m_pChart->legend()->hide(); m_pChart->layout()->setContentsMargins(0, 0, 0, 0); m_pChart->setBackgroundRoundness(0); m_pChart->setTheme(QChart::ChartThemeBlueIcy); - // - m_pThetaAxis = new QValueAxis(); - m_pThetaAxis->setTickCount(13); - m_pThetaAxis->setLabelsFont(QFont("Microsoft YaHei")); - m_pThetaAxis->setLabelFormat("%d"); - m_pThetaAxis->setRange(0, 360); - m_pChart->addAxis(m_pThetaAxis, QPolarChart::PolarOrientationAngular); + //������ + m_pThetaAxis = new QValueAxis(); + m_pThetaAxis->setTickCount(13); + m_pThetaAxis->setLabelsFont(qApp->font()); + m_pThetaAxis->setLabelFormat("%d"); + m_pThetaAxis->setRange(0, 360); + m_pChart->addAxis(m_pThetaAxis, QPolarChart::PolarOrientationAngular); - m_pRadiusAxis = new QValueAxis(); - m_pRadiusAxis->setTickCount(6); - m_pRadiusAxis->setLabelsFont(QFont("Microsoft YaHei")); - m_pRadiusAxis->setLabelFormat("%d"); - m_pRadiusAxis->setRange(0, 30); - m_pChart->addAxis(m_pRadiusAxis, QPolarChart::PolarOrientationRadial); + m_pRadiusAxis = new QValueAxis(); + m_pRadiusAxis->setTickCount(6); + m_pRadiusAxis->setLabelsFont(qApp->font()); + m_pRadiusAxis->setLabelFormat("%d"); + m_pRadiusAxis->setRange(0, 30); + m_pChart->addAxis(m_pRadiusAxis, QPolarChart::PolarOrientationRadial); QChartView *mChartView = new QChartView(); mChartView->setChart(m_pChart); @@ -97,7 +99,12 @@ void PolarPanel::InitUI() QHBoxLayout* mainLayout = new QHBoxLayout(this); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->addWidget(mChartView); - setLayout(mainLayout); + setLayout(mainLayout); + + connect(&RecourceHelper::Get(), &RecourceHelper::FontChanged, this, [this]() { + if (m_pThetaAxis) m_pThetaAxis->setLabelsFont(qApp->font()); + if (m_pRadiusAxis) m_pRadiusAxis->setLabelsFont(qApp->font()); + }); } QString PolarPanel::GetTypeDisplayName() const @@ -345,4 +352,5 @@ void PolarPanel::updateParseFile(const QString& strFile, int nT, FileEntryPolar: file.close(); } -} \ No newline at end of file +} +#include "common/RecourceHelper.h" \ No newline at end of file diff --git a/src/ui/Setting/FontSettingDialog.cpp b/src/ui/Setting/FontSettingDialog.cpp new file mode 100644 index 00000000..64c17ca2 --- /dev/null +++ b/src/ui/Setting/FontSettingDialog.cpp @@ -0,0 +1,138 @@ +#include "FontSettingDialog.h" +#include "ui_FontSettingDialog.h" + +#include +#include +#include +#include +#include + +#include "common/RecourceHelper.h" + +FontSettingDialog::FontSettingDialog(QWidget* parent) + : Dialog(parent) + , ui(new Ui::FontSettingDialog) { + SetupUI(ui); + SetTitle(tr("字体设置")); + + QFont f = qApp->font(); + const QString uiIni = RecourceHelper::Get().GetUiConfigPath(); + QSettings uiSettings(uiIni, QSettings::IniFormat); + QString family = uiSettings.value("ui/fontFamily", f.family()).toString(); + QString style = uiSettings.value("ui/fontStyle", QString()).toString(); + bool underline = uiSettings.value("ui/underline", false).toBool(); + bool strike = uiSettings.value("ui/strikeOut", false).toBool(); + + basePt_ = QFontInfo(f).pointSizeF(); + if (basePt_ <= 0.0) basePt_ = 9.0; + + ui->preview->setText(tr("AaBb中文预览")); + + ui->fontCombo->setCurrentText(family); + QFontDatabase db; + ui->styleCombo->clear(); + QStringList styles = db.styles(ui->fontCombo->currentText()); + ui->styleCombo->addItems(styles); + if (!style.isEmpty()) ui->styleCombo->setCurrentText(style); + ui->underlineCheck->setChecked(underline); + ui->strikeCheck->setChecked(strike); + + ui->sizeList->clear(); + QList pts = db.pointSizes(ui->fontCombo->currentText(), ui->styleCombo->currentText()); + if (pts.isEmpty()) pts = db.standardSizes(); + for (int p : pts) { + ui->sizeList->addItem(QString::number(p)); + if (p == static_cast(basePt_)) ui->sizeList->setCurrentRow(ui->sizeList->count()-1); + } + UpdatePreview(); + + connect(ui->fontCombo, &QFontComboBox::currentTextChanged, this, [this](const QString& fam) { + QFontDatabase db; + ui->styleCombo->clear(); + ui->styleCombo->addItems(db.styles(fam)); + ui->sizeList->clear(); + QList pts = db.pointSizes(fam, ui->styleCombo->currentText()); + if (pts.isEmpty()) pts = db.standardSizes(); + for (int p : pts) { + ui->sizeList->addItem(QString::number(p)); + } + UpdatePreview(); + }); + connect(ui->styleCombo, &QComboBox::currentTextChanged, this, [this](const QString&) { + QFontDatabase db; + ui->sizeList->clear(); + QList pts = db.pointSizes(ui->fontCombo->currentText(), ui->styleCombo->currentText()); + if (pts.isEmpty()) pts = db.standardSizes(); + for (int p : pts) { + ui->sizeList->addItem(QString::number(p)); + } + UpdatePreview(); + }); + connect(ui->sizeList, &QListWidget::currentRowChanged, this, [this](int) { UpdatePreview(); }); + connect(ui->underlineCheck, &QCheckBox::toggled, this, [this](bool) { UpdatePreview(); }); + connect(ui->strikeCheck, &QCheckBox::toggled, this, [this](bool) { UpdatePreview(); }); + connect(ui->btnApply, &QPushButton::clicked, this, [this]() { + ApplySelection(); + }); + connect(ui->btnOk, &QPushButton::clicked, this, [this]() { + ApplySelection(); + accept(); + }); + connect(ui->btnReset, &QPushButton::clicked, this, [this]() { + ui->fontCombo->setCurrentText(QFontInfo(qApp->font()).family()); + ui->styleCombo->setCurrentIndex(0); + int idx = ui->sizeList->row(ui->sizeList->findItems(QString::number(static_cast(basePt_)), Qt::MatchExactly).value(0)); + if (idx >= 0) ui->sizeList->setCurrentRow(idx); + ui->underlineCheck->setChecked(false); + ui->strikeCheck->setChecked(false); + UpdatePreview(); + }); + connect(ui->btnCancel, &QPushButton::clicked, this, [this]() { reject(); }); +} + +void FontSettingDialog::UpdatePreview() { + QFontDatabase db; + QString fam = ui->fontCombo->currentText(); + QString sty = ui->styleCombo->currentText(); + int pt = basePt_; + if (ui->sizeList->currentItem()) pt = ui->sizeList->currentItem()->text().toInt(); + QFont f = db.font(fam, sty, pt); + f.setUnderline(ui->underlineCheck->isChecked()); + f.setStrikeOut(ui->strikeCheck->isChecked()); + ui->preview->setFont(f); +} + +void FontSettingDialog::ApplySelection() { + const QString uiIni = RecourceHelper::Get().GetUiConfigPath(); + QFileInfo fi(uiIni); + QDir().mkpath(fi.dir().path()); + QSettings uiSettings(uiIni, QSettings::IniFormat); + + QFontDatabase db; + QString fam = ui->fontCombo->currentText(); + QString sty = ui->styleCombo->currentText(); + int pt = basePt_; + if (ui->sizeList->currentItem()) pt = ui->sizeList->currentItem()->text().toInt(); + QFont f = db.font(fam, sty, pt); + bool bold = sty.contains("Bold", Qt::CaseInsensitive); + bool italic = sty.contains("Italic", Qt::CaseInsensitive); + int w = bold ? 700 : 400; + f.setBold(bold); + f.setItalic(italic); + f.setUnderline(ui->underlineCheck->isChecked()); + f.setStrikeOut(ui->strikeCheck->isChecked()); + RecourceHelper::Get().ApplyGlobalFont(f); + + uiSettings.setValue("ui/fontScale", 1.0); + uiSettings.setValue("ui/fontFamily", fam); + uiSettings.setValue("ui/fontStyle", sty); + uiSettings.setValue("ui/italic", italic); + uiSettings.setValue("ui/basePointSize", pt); + uiSettings.setValue("ui/fontWeight", w); + uiSettings.setValue("ui/underline", ui->underlineCheck->isChecked()); + uiSettings.setValue("ui/strikeOut", ui->strikeCheck->isChecked()); + uiSettings.sync(); +} +FontSettingDialog::~FontSettingDialog() { + delete ui; +} \ No newline at end of file diff --git a/src/ui/Setting/FontSettingDialog.h b/src/ui/Setting/FontSettingDialog.h new file mode 100644 index 00000000..7fe9b785 --- /dev/null +++ b/src/ui/Setting/FontSettingDialog.h @@ -0,0 +1,21 @@ +#pragma once + +#include "ui/Dialog.h" + +namespace Ui { class FontSettingDialog; } + +class FontSettingDialog : public Dialog { + Q_OBJECT + +public: + explicit FontSettingDialog(QWidget* parent = 0); + ~FontSettingDialog() override; + +private: + void UpdatePreview(); + void ApplySelection(); + +private: + Ui::FontSettingDialog* ui{}; + double basePt_{}; +}; \ No newline at end of file diff --git a/src/ui/Setting/FontSettingDialog.ui b/src/ui/Setting/FontSettingDialog.ui new file mode 100644 index 00000000..03fc6624 --- /dev/null +++ b/src/ui/Setting/FontSettingDialog.ui @@ -0,0 +1,156 @@ + + + FontSettingDialog + + + + 0 + 0 + 528 + 548 + + + + 字体设置 + + + + + + + + + + + + + + 斜体 + + + + + + + + + + 100 + + + 900 + + + 50 + + + 400 + + + + + + + + + + + + + + + + + 0 + 120 + + + + AaBb中文预览 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + 下划线 + + + + + + + 删除线 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 应用 + + + + + + + 确定 + + + + + + + 重置 + + + + + + + 取消 + + + + + + + + + + diff --git a/src/ui/WorkSpace/AddTableFileDlg.cpp b/src/ui/WorkSpace/AddTableFileDlg.cpp index f189bde2..afec0cd1 100644 --- a/src/ui/WorkSpace/AddTableFileDlg.cpp +++ b/src/ui/WorkSpace/AddTableFileDlg.cpp @@ -90,10 +90,10 @@ void AddTableFileDlg::onHeadersChanged() { if (!data.isEmpty() && !validateCurveData(data, headers.size())) { ui->dataValidationLabel->setText(QString("Data values must match the number of headers (%1)").arg(headers.size())); - ui->dataValidationLabel->setStyleSheet("color: red; font-size: 11px;"); + ui->dataValidationLabel->setStyleSheet("color: red;"); } else { ui->dataValidationLabel->setText(QString("Data values must match the number of headers (%1)").arg(headers.size())); - ui->dataValidationLabel->setStyleSheet("color: gray; font-size: 11px;"); + ui->dataValidationLabel->setStyleSheet("color: gray;"); } } } @@ -201,10 +201,10 @@ void AddTableFileDlg::onCurveDataChanged() { if (!dataText.isEmpty() && !validateCurveData(dataText, headers.size())) { ui->dataValidationLabel->setText(QString("Data count (%1) doesn't match headers count (%2)") .arg(dataList.size()).arg(headers.size())); - ui->dataValidationLabel->setStyleSheet("color: red; font-size: 11px;"); + ui->dataValidationLabel->setStyleSheet("color: red;"); } else { ui->dataValidationLabel->setText(QString("Data values must match the number of headers (%1)").arg(headers.size())); - ui->dataValidationLabel->setStyleSheet("color: gray; font-size: 11px;"); + ui->dataValidationLabel->setStyleSheet("color: gray;"); } } }