widget: add support for changing title font

Not needed for Qt Quick, because you can easily to change it:

```qml
StandardTitleBar {
    titleLabel {
        font {
            family: "Arial"
            pointSize: 10
            italic: true
        }
    }
}
```

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2022-09-02 10:39:45 +08:00
parent f052a087de
commit 5018d9ea82
6 changed files with 52 additions and 10 deletions

View File

@ -25,7 +25,7 @@
cmake_minimum_required(VERSION 3.20)
project(FramelessHelper
VERSION 2.2.1.0
VERSION 2.3.0.0
DESCRIPTION "Cross-platform window customization framework for Qt Widgets and Qt Quick."
HOMEPAGE_URL "https://github.com/wangwenx190/framelesshelper/"
LANGUAGES CXX

View File

@ -41,8 +41,13 @@
# endif // ((QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) && !REGISTRYKEY_FORCE_QSETTINGS)
#endif // REGISTRYKEY_IMPL
#define REGISTRYKEY_QWINREGISTRYKEY ((REGISTRYKEY_IMPL) == 1)
#define REGISTRYKEY_QSETTINGS ((REGISTRYKEY_IMPL) == 2)
#ifndef REGISTRYKEY_QWINREGISTRYKEY
# define REGISTRYKEY_QWINREGISTRYKEY ((REGISTRYKEY_IMPL) == 1)
#endif // REGISTRYKEY_QWINREGISTRYKEY
#ifndef REGISTRYKEY_QSETTINGS
# define REGISTRYKEY_QSETTINGS ((REGISTRYKEY_IMPL) == 2)
#endif // REGISTRYKEY_QSETTINGS
QT_BEGIN_NAMESPACE
class QWinRegistryKey;

View File

@ -28,6 +28,7 @@
#include "standardtitlebar.h"
#include <QtCore/qobject.h>
#include <QtCore/qpointer.h>
#include <optional>
QT_BEGIN_NAMESPACE
class QPaintEvent;
@ -73,6 +74,9 @@ public:
Q_NODISCARD bool windowIconVisible() const;
void setWindowIconVisible(const bool value);
Q_NODISCARD QFont titleFont() const;
void setTitleFont(const QFont &value);
public Q_SLOTS:
void updateMaximizeButton();
void updateTitleBarColor();
@ -98,6 +102,7 @@ private:
bool m_titleLabelVisible = true;
QSize m_windowIconSize = {};
bool m_windowIconVisible = false;
std::optional<QFont> m_titleFont = std::nullopt;
};
FRAMELESSHELPER_END_NAMESPACE

View File

@ -51,6 +51,7 @@ class FRAMELESSHELPER_WIDGETS_API StandardTitleBar : public QWidget
Q_PROPERTY(bool titleLabelVisible READ titleLabelVisible WRITE setTitleLabelVisible NOTIFY titleLabelVisibleChanged FINAL)
Q_PROPERTY(QSize windowIconSize READ windowIconSize WRITE setWindowIconSize NOTIFY windowIconSizeChanged FINAL)
Q_PROPERTY(bool windowIconVisible READ windowIconVisible WRITE setWindowIconVisible NOTIFY windowIconVisibleChanged FINAL)
Q_PROPERTY(QFont titleFont READ titleFont WRITE setTitleFont NOTIFY titleFontChanged FINAL)
public:
explicit StandardTitleBar(QWidget *parent = nullptr);
@ -80,6 +81,9 @@ public:
Q_NODISCARD bool windowIconVisible() const;
void setWindowIconVisible(const bool value);
Q_NODISCARD QFont titleFont() const;
void setTitleFont(const QFont &value);
protected:
void paintEvent(QPaintEvent *event) override;
@ -90,6 +94,7 @@ Q_SIGNALS:
void titleLabelVisibleChanged();
void windowIconSizeChanged();
void windowIconVisibleChanged();
void titleFontChanged();
private:
QScopedPointer<StandardTitleBarPrivate> d_ptr;

View File

@ -34,10 +34,10 @@
#pragma once
[[maybe_unused]] static constexpr const int FRAMELESSHELPER_VERSION_MAJOR = 2;
[[maybe_unused]] static constexpr const int FRAMELESSHELPER_VERSION_MINOR = 2;
[[maybe_unused]] static constexpr const int FRAMELESSHELPER_VERSION_PATCH = 1;
[[maybe_unused]] static constexpr const int FRAMELESSHELPER_VERSION_MINOR = 3;
[[maybe_unused]] static constexpr const int FRAMELESSHELPER_VERSION_PATCH = 0;
[[maybe_unused]] static constexpr const int FRAMELESSHELPER_VERSION_TWEAK = 0;
[[maybe_unused]] static constexpr const char FRAMELESSHELPER_VERSION_STR[] = "2.2.1.0\0";
[[maybe_unused]] static constexpr const char FRAMELESSHELPER_VERSION_STR[] = "2.3.0.0\0";
[[maybe_unused]] static constexpr const char FRAMELESSHELPER_COMMIT_STR[] = "UNKNOWN\0";
[[maybe_unused]] static constexpr const char FRAMELESSHELPER_COMPILE_DATETIME_STR[] = "UNKNOWN\0";

View File

@ -154,13 +154,12 @@ void StandardTitleBarPrivate::paintTitleBar(QPaintEvent *event)
if (m_titleLabelVisible) {
const QString text = m_window->windowTitle();
if (!text.isEmpty()) {
const QFont font = [q]() -> QFont {
painter.setPen(foregroundColor);
painter.setFont(m_titleFont.value_or([q]() -> QFont {
QFont f = q->font();
f.setPointSize(kDefaultTitleBarFontPointSize);
return f;
}();
painter.setPen(foregroundColor);
painter.setFont(font);
}()));
const QRect rect = [this, q, titleLabelLeftOffset]() -> QRect {
const int w = q->width();
int leftMargin = 0;
@ -235,6 +234,22 @@ void StandardTitleBarPrivate::setWindowIconVisible(const bool value)
Q_EMIT q->windowIconVisibleChanged();
}
QFont StandardTitleBarPrivate::titleFont() const
{
return m_titleFont.value_or(QFont());
}
void StandardTitleBarPrivate::setTitleFont(const QFont &value)
{
if (titleFont() == value) {
return;
}
m_titleFont = value;
Q_Q(StandardTitleBar);
q->update();
Q_EMIT q->titleFontChanged();
}
void StandardTitleBarPrivate::updateMaximizeButton()
{
const bool max = m_window->isMaximized();
@ -478,6 +493,18 @@ void StandardTitleBar::setWindowIconVisible(const bool value)
d->setWindowIconVisible(value);
}
QFont StandardTitleBar::titleFont() const
{
Q_D(const StandardTitleBar);
return d->titleFont();
}
void StandardTitleBar::setTitleFont(const QFont &value)
{
Q_D(StandardTitleBar);
d->setTitleFont(value);
}
void StandardTitleBar::paintEvent(QPaintEvent *event)
{
Q_D(StandardTitleBar);