From 735829f66540a7511ab7c1526a90c2f7b2506f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=9D=E6=99=82=E9=9B=A8?= Date: Fri, 3 Nov 2023 10:18:16 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=8C=88=20style(TrayNotificationSender?= =?UTF-8?q?):=20=E4=BD=BF=E7=94=A8=20Qt=20Widgets=20=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=89=98=E7=9B=98=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原本从 QML 中赌徒托盘图标的方法改为直接使用 Qt Widgets, 写法更加阳间 fixes #16 --- CMakeLists.txt | 2 ++ HeAlarm.cpp | 1 - HeAlarm.h | 1 - HeAlarmApp.cpp | 5 ++--- Main.qml | 11 +---------- TrayNotificationSender.cpp | 16 ++++++++-------- TrayNotificationSender.h | 6 ++++-- 7 files changed, 17 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 51bc3c3..cb1dffb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) find_package(Qt6 6.5 REQUIRED COMPONENTS Quick) +find_package(Qt6 6.5 REQUIRED COMPONENTS Widgets) qt_standard_project_setup(REQUIRES 6.5) @@ -57,6 +58,7 @@ set_target_properties(HeAlarm PROPERTIES target_link_libraries(HeAlarm PRIVATE Qt6::Quick + PRIVATE Qt6::Widgets ) include(GNUInstallDirs) diff --git a/HeAlarm.cpp b/HeAlarm.cpp index 23fd03b..0e23abc 100644 --- a/HeAlarm.cpp +++ b/HeAlarm.cpp @@ -5,7 +5,6 @@ HeAlarmApp* HeAlarm::s_app = nullptr; QQmlApplicationEngine* HeAlarm::s_qmlEngine = nullptr; -QObject* HeAlarm::s_trayIcon = nullptr; AlarmFileManager* HeAlarm::s_alarmFileManager = nullptr; AlarmModel* HeAlarm::s_alarmModel = nullptr; CoreNotifier* HeAlarm::s_notifier = nullptr; diff --git a/HeAlarm.h b/HeAlarm.h index d37df29..3193d2d 100644 --- a/HeAlarm.h +++ b/HeAlarm.h @@ -21,7 +21,6 @@ class HeAlarm : public QObject private: static HeAlarmApp* s_app; static QQmlApplicationEngine* s_qmlEngine; - static QObject* s_trayIcon; static AlarmFileManager* s_alarmFileManager; static AlarmModel* s_alarmModel; static CoreNotifier* s_notifier; diff --git a/HeAlarmApp.cpp b/HeAlarmApp.cpp index 249716f..127e4e7 100644 --- a/HeAlarmApp.cpp +++ b/HeAlarmApp.cpp @@ -19,11 +19,10 @@ void HeAlarmApp::init() HeAlarm::s_alarmModel = new AlarmModel; HeAlarm::s_alarmFileManager = new AlarmFileManager(HeAlarm::alarmModel()); HeAlarm::s_notifier = new CoreNotifier(HeAlarm::alarmModel()); + HeAlarm::s_notificationSender = new TrayNotificationSender; + connect(HeAlarm::notifier(), &CoreNotifier::alarmTriggered, HeAlarm::s_notificationSender, &TrayNotificationSender::sendNotification); QObject::connect(HeAlarm::qmlEngine(), &QQmlApplicationEngine::objectCreationFailed, HeAlarm::app(), []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); HeAlarm::qmlEngine()->loadFromModule("HeAlarm", "Main"); - HeAlarm::s_trayIcon = HeAlarm::qmlEngine()->rootObjects().at(0)->findChild("sysTrayIcon"); - HeAlarm::s_notificationSender = new TrayNotificationSender(HeAlarm::s_trayIcon); - connect(HeAlarm::notifier(), &CoreNotifier::alarmTriggered, HeAlarm::s_notificationSender, &TrayNotificationSender::sendNotification); } diff --git a/Main.qml b/Main.qml index 99cf2f4..023d31a 100644 --- a/Main.qml +++ b/Main.qml @@ -25,9 +25,7 @@ Window { currentIndex: nvgBar.currentIndex onCurrentIndexChanged: nvgBar.currentIndex = currentIndex - ClockPage { - - } + ClockPage {} AlarmPage { editPage: editPge @@ -48,11 +46,4 @@ Window { visible: false onCancled: visible = false } - - Platform.SystemTrayIcon { - objectName: "sysTrayIcon" - icon.source: "qrc:///res/Logo.png" - tooltip: "HeAlarm 0.1.0" - visible: true - } } diff --git a/TrayNotificationSender.cpp b/TrayNotificationSender.cpp index d930b19..8ed1e2c 100644 --- a/TrayNotificationSender.cpp +++ b/TrayNotificationSender.cpp @@ -1,19 +1,19 @@ #include "TrayNotificationSender.h" #include "AlarmData.h" #include +#include -TrayNotificationSender::TrayNotificationSender(QObject* trayIcon, QObject *parent) : - QObject{parent}, - m_trayIcon {trayIcon} +TrayNotificationSender::TrayNotificationSender(QObject *parent) : + QObject{parent} { - + m_trayIcon = new QSystemTrayIcon; + m_trayIcon->setIcon(QIcon(":/res/Logo.png")); + m_trayIcon->setToolTip("HeAlarm 0.1.1"); + m_trayIcon->show(); } void TrayNotificationSender::sendNotification(const QVariant& var) { auto alm = var.value(); - QMetaObject::invokeMethod(m_trayIcon, "showMessage", - alm.title, - QTime(alm.hour, alm.minute).toString("HH:mm") - ); + m_trayIcon->showMessage(alm.title, QTime(alm.hour, alm.minute).toString("HH:mm"), m_trayIcon->icon(), 600000); } diff --git a/TrayNotificationSender.h b/TrayNotificationSender.h index c4604b4..d5e84d2 100644 --- a/TrayNotificationSender.h +++ b/TrayNotificationSender.h @@ -1,15 +1,17 @@ #pragma once #include +class QSystemTrayIcon; + class TrayNotificationSender : public QObject { Q_OBJECT private: static constexpr int duration = 600000; private: - QObject* m_trayIcon; + QSystemTrayIcon* m_trayIcon; public: - explicit TrayNotificationSender(QObject* trayIcon, QObject *parent = nullptr); + explicit TrayNotificationSender(QObject *parent = nullptr); public slots: void sendNotification(const QVariant& var); }; From dbeeb5a5e9099ad83175d0034001fa1445697c35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=9D=E6=99=82=E9=9B=A8?= Date: Fri, 3 Nov 2023 11:11:38 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=90=9E=20fix:=20=E4=B8=8D=E4=BC=9A?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=85=B3=E9=97=AD=E4=BB=85=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E7=9A=84=E9=97=B9=E9=92=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes #18 --- AlarmDelegate.qml | 2 +- AlarmModel.cpp | 2 +- AlarmPage.qml | 8 ++++++++ CoreNotifier.cpp | 7 +++++-- CoreNotifier.h | 4 ++-- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/AlarmDelegate.qml b/AlarmDelegate.qml index b381d1a..11a3c1d 100644 --- a/AlarmDelegate.qml +++ b/AlarmDelegate.qml @@ -7,7 +7,7 @@ import "HeAlarmJs.js" as HeAlarmJs Item { property int hour: 10 property int minute: 10 - property bool isActive: true + property bool isActive property string title: "闹铃" property int activeDays: HeAlarm.All signal clicked() diff --git a/AlarmModel.cpp b/AlarmModel.cpp index e686de6..e912a43 100644 --- a/AlarmModel.cpp +++ b/AlarmModel.cpp @@ -90,7 +90,7 @@ void AlarmModel::setIsActive(int row, bool isActive) if (m_data[row].isActive == isActive) return; m_data[row].isActive = isActive; - emit dataChanged(index(row), index(row), {AlarmDataRoles::IsActiveRole}); + emit dataChanged(index(row), index(row), {AlarmModel::IsActiveRole}); } void AlarmModel::remove(int row) diff --git a/AlarmPage.qml b/AlarmPage.qml index 0d073ba..bb89add 100644 --- a/AlarmPage.qml +++ b/AlarmPage.qml @@ -38,6 +38,14 @@ Item { editBtn.visible = true } onIsActiveChanged: globalProp.alarmModel.setIsActive(index, isActive) + Connections { + target: globalProp.alarmModel + function onDataChanged(topLeft, bottomRight) { + if (index < topLeft.row || bottomRight.row < index) + return + isActive = globalProp.alarmModel.data(globalProp.alarmModel.index(index, 0), AlarmModel.IsActiveRole) + } + } } } diff --git a/CoreNotifier.cpp b/CoreNotifier.cpp index 41d770f..9cd1e5b 100644 --- a/CoreNotifier.cpp +++ b/CoreNotifier.cpp @@ -5,7 +5,7 @@ #include #include "HeAlarm.h" -CoreNotifier::CoreNotifier(const AlarmModel* model, QObject *parent) : +CoreNotifier::CoreNotifier(AlarmModel* model, QObject *parent) : QObject{parent}, m_model {model} { @@ -23,8 +23,9 @@ void CoreNotifier::restartTimers() delete pt; m_timerList.clear(); const auto& data = m_model->rawData(); - for (const auto& alm : data) + for (int i = 0; i < data.size(); i++) { + const auto& alm = data.at(i); if (!alm.isActive) continue; auto current = QDateTime::currentDateTime(); @@ -38,6 +39,8 @@ void CoreNotifier::restartTimers() auto timer = new QTimer(this); m_timerList.push_back(timer); connect(timer, &QTimer::timeout, this, [this, alm]() {emit this->alarmTriggered(QVariant::fromValue(alm));}); + if (alm.activeDays == 0) + connect(timer, &QTimer::timeout, m_model, [this, i]() {this->m_model->setIsActive(i, false);}); timer->setInterval(duration); timer->setSingleShot(true); timer->start(); diff --git a/CoreNotifier.h b/CoreNotifier.h index fd1ab9e..041192a 100644 --- a/CoreNotifier.h +++ b/CoreNotifier.h @@ -10,10 +10,10 @@ class CoreNotifier : public QObject { Q_OBJECT private: - const AlarmModel* m_model; + AlarmModel* m_model; QList m_timerList; public: - explicit CoreNotifier(const AlarmModel* model, QObject *parent = nullptr); + explicit CoreNotifier(AlarmModel* model, QObject *parent = nullptr); signals: void alarmTriggered(QVariant data); private slots: From 3a69a84c0bff11df1e0a28a2f1523737e469a310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=9D=E6=99=82=E9=9B=A8?= Date: Fri, 3 Nov 2023 11:26:05 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=8C=88=20style:=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E4=BA=86=E5=BA=94=E7=94=A8=E4=BF=A1=E6=81=AF=E7=9A=84=E8=AE=BE?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HeAlarm.cpp | 6 ++++++ HeAlarm.h | 5 +++++ HeAlarmApp.cpp | 32 +++++++++++++++++++++----------- HeAlarmApp.h | 1 + Main.qml | 1 - 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/HeAlarm.cpp b/HeAlarm.cpp index 0e23abc..319fce2 100644 --- a/HeAlarm.cpp +++ b/HeAlarm.cpp @@ -2,6 +2,7 @@ #include "AlarmFileManager.h" #include #include +#include HeAlarmApp* HeAlarm::s_app = nullptr; QQmlApplicationEngine* HeAlarm::s_qmlEngine = nullptr; @@ -13,6 +14,11 @@ TrayNotificationSender* HeAlarm::s_notificationSender = nullptr; HeAlarm::HeAlarm(QObject* parent) : QObject {parent} {} +QString HeAlarm::versionString() +{ + return QString::fromStdString(std::format("{}.{}.{}", s_versionMajor, s_versionMinor, s_versionPatch)); +} + HeAlarmApp* HeAlarm::app() { return s_app; diff --git a/HeAlarm.h b/HeAlarm.h index 3193d2d..900aba2 100644 --- a/HeAlarm.h +++ b/HeAlarm.h @@ -19,6 +19,10 @@ class HeAlarm : public QObject enum DayOfWeek {Monday = 0x1, Tuesday = 0x2, Wednesday = 0x4, Thursday = 0x8, Friday = 0x10, Saturday = 0x20, Sunday = 0x40, Weekday = 0x1F, Weekend = 0x60, All = 0x7F}; Q_ENUM(DayOfWeek) private: + const static auto s_versionMajor = 0; + const static auto s_versionMinor = 1; + const static auto s_versionPatch = 1; + private: static HeAlarmApp* s_app; static QQmlApplicationEngine* s_qmlEngine; static AlarmFileManager* s_alarmFileManager; @@ -30,6 +34,7 @@ class HeAlarm : public QObject public: explicit HeAlarm(QObject* parent = nullptr); public: + static QString versionString(); static HeAlarmApp* app(); static QQmlApplicationEngine* qmlEngine(); static AlarmFileManager* alarmFileManager(); diff --git a/HeAlarmApp.cpp b/HeAlarmApp.cpp index 127e4e7..6130edd 100644 --- a/HeAlarmApp.cpp +++ b/HeAlarmApp.cpp @@ -14,15 +14,25 @@ HeAlarmApp::HeAlarmApp(int argc, char** argv) : void HeAlarmApp::init() { - HeAlarm::s_app = this; - HeAlarm::s_qmlEngine = new QQmlApplicationEngine; - HeAlarm::s_alarmModel = new AlarmModel; - HeAlarm::s_alarmFileManager = new AlarmFileManager(HeAlarm::alarmModel()); - HeAlarm::s_notifier = new CoreNotifier(HeAlarm::alarmModel()); - HeAlarm::s_notificationSender = new TrayNotificationSender; - connect(HeAlarm::notifier(), &CoreNotifier::alarmTriggered, HeAlarm::s_notificationSender, &TrayNotificationSender::sendNotification); - QObject::connect(HeAlarm::qmlEngine(), &QQmlApplicationEngine::objectCreationFailed, - HeAlarm::app(), []() { QCoreApplication::exit(-1); }, - Qt::QueuedConnection); - HeAlarm::qmlEngine()->loadFromModule("HeAlarm", "Main"); + fillAppInfo(); + HeAlarm::s_app = this; + HeAlarm::s_qmlEngine = new QQmlApplicationEngine; + HeAlarm::s_alarmModel = new AlarmModel; + HeAlarm::s_alarmFileManager = new AlarmFileManager(HeAlarm::alarmModel()); + HeAlarm::s_notifier = new CoreNotifier(HeAlarm::alarmModel()); + HeAlarm::s_notificationSender = new TrayNotificationSender; + connect(HeAlarm::notifier(), &CoreNotifier::alarmTriggered, HeAlarm::s_notificationSender, &TrayNotificationSender::sendNotification); + QObject::connect(HeAlarm::qmlEngine(), &QQmlApplicationEngine::objectCreationFailed, + HeAlarm::app(), []() { QCoreApplication::exit(-1); }, + Qt::QueuedConnection); + HeAlarm::qmlEngine()->loadFromModule("HeAlarm", "Main"); +} + +void HeAlarmApp::fillAppInfo() +{ + setApplicationName("HeAlarm"); + setApplicationDisplayName("HeAlarm"); + setApplicationVersion(HeAlarm::versionString()); + setOrganizationName("初時雨"); + setOrganizationDomain("Hatsushigure.github.io"); } diff --git a/HeAlarmApp.h b/HeAlarmApp.h index e088ea4..2aa0b34 100644 --- a/HeAlarmApp.h +++ b/HeAlarmApp.h @@ -7,5 +7,6 @@ class HeAlarmApp: public QGuiApplication HeAlarmApp(int argc, char** argv); private: void init(); + void fillAppInfo(); }; diff --git a/Main.qml b/Main.qml index 023d31a..777797d 100644 --- a/Main.qml +++ b/Main.qml @@ -6,7 +6,6 @@ import QtQuick.Controls.Material as Controls Window { width: 640; height: 724 visible: true - title: qsTr("HeAlarm 0.1.0") color: "#f1f1f1" minimumWidth: swpView.currentItem.implicitWidth; minimumHeight: 600 From ebcdbbe6cd7d71f2bbb2d83d32c7b89de47fe496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=9D=E6=99=82=E9=9B=A8?= Date: Fri, 3 Nov 2023 11:38:02 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=90=9E=20fix:=20=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E4=B8=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes #17 --- HeAlarmApp.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/HeAlarmApp.cpp b/HeAlarmApp.cpp index 6130edd..4be20ff 100644 --- a/HeAlarmApp.cpp +++ b/HeAlarmApp.cpp @@ -5,6 +5,8 @@ #include "HeAlarm.h" #include "TrayNotificationSender.h" #include +#include +#include HeAlarmApp::HeAlarmApp(int argc, char** argv) : QGuiApplication {argc, argv} @@ -35,4 +37,12 @@ void HeAlarmApp::fillAppInfo() setApplicationVersion(HeAlarm::versionString()); setOrganizationName("初時雨"); setOrganizationDomain("Hatsushigure.github.io"); + auto pix = QPixmap(":/res/Logo.png"); + auto icon = QIcon(); + icon.addPixmap(pix); + icon.addPixmap(pix.scaled({64, 64}, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + icon.addPixmap(pix.scaled({48, 48}, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + icon.addPixmap(pix.scaled({32, 32}, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + icon.addPixmap(pix.scaled({16, 16}, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + setWindowIcon(QIcon(pix)); }