Libsource: Fix the multithread bug in QML engine.

This commit is contained in:
Mentalflow 2024-01-03 23:30:14 +08:00
parent 73ebc786a8
commit ee6ea7840d
Signed by: Mentalflow
GPG Key ID: 5AE68D4401A2EE71
4 changed files with 24 additions and 7 deletions

View File

@ -23,8 +23,14 @@ RibbonTheme::RibbonTheme()
} }
RibbonTheme* RibbonTheme::instance(){ RibbonTheme* RibbonTheme::instance(){
static RibbonTheme instance; static QMutex mutex;
return &instance; QMutexLocker locker(&mutex);
static RibbonTheme *singleton = nullptr;
if (!singleton) {
singleton = new RibbonTheme();
}
return singleton;
} }
bool RibbonTheme::eventFilter(QObject *obj, QEvent *event) bool RibbonTheme::eventFilter(QObject *obj, QEvent *event)

View File

@ -10,16 +10,18 @@ class RibbonTheme : public QQuickItem
QML_ELEMENT QML_ELEMENT
QML_SINGLETON QML_SINGLETON
QML_NAMED_ELEMENT(RibbonTheme) QML_NAMED_ELEMENT(RibbonTheme)
Q_DISABLE_COPY(RibbonTheme)
Q_PROPERTY(bool dark_mode READ dark_mode() NOTIFY dark_modeChanged FINAL) Q_PROPERTY(bool dark_mode READ dark_mode() NOTIFY dark_modeChanged FINAL)
Q_PROPERTY_RW(RibbonThemeType::ThemeMode,theme_mode) Q_PROPERTY_RW(RibbonThemeType::ThemeMode,theme_mode)
Q_PROPERTY_RW(bool,modern_style) Q_PROPERTY_RW(bool,modern_style)
public: public:
RibbonTheme(); static RibbonTheme* create(QQmlEngine *qmlEngine, QJSEngine *jsEngine){return instance();}
static RibbonTheme* instance(); static RibbonTheme* instance();
Q_SIGNAL void dark_modeChanged(); Q_SIGNAL void dark_modeChanged();
bool dark_mode(); bool dark_mode();
private: private:
RibbonTheme();
bool eventFilter(QObject *obj, QEvent *event); bool eventFilter(QObject *obj, QEvent *event);
RibbonThemeType::ThemeMode current_theme(); RibbonThemeType::ThemeMode current_theme();
RibbonThemeType::ThemeMode _system_theme_mode; RibbonThemeType::ThemeMode _system_theme_mode;

View File

@ -1,5 +1,5 @@
#include "ribbonui.h" #include "ribbonui.h"
#include <QMutex>
#define STR(x) #x #define STR(x) #x
#define JOIN(a,b,c,d) STR(a.b.c.d) #define JOIN(a,b,c,d) STR(a.b.c.d)
#define VER_JOIN(x) JOIN x #define VER_JOIN(x) JOIN x
@ -11,6 +11,12 @@ RibbonUI::RibbonUI(QQuickItem *parent)
} }
RibbonUI* RibbonUI::instance(){ RibbonUI* RibbonUI::instance(){
static RibbonUI instance; static QMutex mutex;
return &instance; QMutexLocker locker(&mutex);
static RibbonUI *singleton = nullptr;
if (!singleton) {
singleton = new RibbonUI();
}
return singleton;
} }

View File

@ -10,10 +10,13 @@ class RibbonUI : public QQuickItem
QML_ELEMENT QML_ELEMENT
QML_SINGLETON QML_SINGLETON
QML_NAMED_ELEMENT(RibbonUI) QML_NAMED_ELEMENT(RibbonUI)
Q_DISABLE_COPY(RibbonUI)
Q_PROPERTY_RW(QString, version) Q_PROPERTY_RW(QString, version)
public: public:
explicit RibbonUI(QQuickItem *parent = nullptr);
static RibbonUI* instance(); static RibbonUI* instance();
static RibbonUI* create(QQmlEngine *qmlEngine, QJSEngine *jsEngine){return instance();}
private:
explicit RibbonUI(QQuickItem *parent = nullptr);
}; };
#endif // RIBBONUI_H #endif // RIBBONUI_H