diff --git a/include/spdlog/sinks/qt_sinks.h b/include/spdlog/sinks/qt_sinks.h index f6e0b684..22850961 100644 --- a/include/spdlog/sinks/qt_sinks.h +++ b/include/spdlog/sinks/qt_sinks.h @@ -4,8 +4,8 @@ #pragma once // -// Custom sink for QPlainTextEdit or QTextEdit and its children(QTextBrowser... -// etc) Building and using requires Qt library. +// Custom sink for QPlainTextEdit or QTextEdit and its childs(QTextBrowser... etc) +// Building and using requires Qt library. // #include "spdlog/common.h" @@ -13,152 +13,69 @@ #include "spdlog/details/synchronous_factory.h" #include "spdlog/sinks/base_sink.h" -#include -#include #include - -namespace _spdlog_p { -namespace _sinks_p { -// -// Private class for QTextEdit and its derivatives -// -class qtextedit_sink_p : public QObject -{ - Q_OBJECT -public: - qtextedit_sink_p(QTextEdit *textedit = nullptr) - { - if (textedit != nullptr) - { - textedit_ = textedit; - connect(this, &qtextedit_sink_p::append_text, textedit_, &QTextEdit::append); - } - } - - ~qtextedit_sink_p() {} - - void append(const spdlog::string_view_t &str) - { - emit append_text( QString::fromUtf8(str.data(), static_cast(str.size())).trimmed() ); - } - -signals: - void append_text(const QString &); - -private: - QTextEdit *textedit_ = nullptr; -}; - -// -// Private class for QPlainTextEdit -// -class qplaintextedit_sink_p : public QObject -{ - Q_OBJECT -public: - qplaintextedit_sink_p(QPlainTextEdit *textedit = nullptr) - { - if (textedit != nullptr) - { - textedit_ = textedit; - connect(this, &qplaintextedit_sink_p::append_text, textedit_, &QPlainTextEdit::appendPlainText); - } - } - - ~qplaintextedit_sink_p() {} - - void append(const spdlog::string_view_t &str) - { - emit append_text( QString::fromUtf8(str.data(), static_cast(str.size())).trimmed() ); - } - -signals: - void append_text(const QString &); - -private: - QPlainTextEdit *textedit_ = nullptr; -}; -} // namespace _sinks_p -} // namespace _spdlog_p +#include // // qtextedit_sink class // namespace spdlog { namespace sinks { -template -class qtextedit_sink : public base_sink -{ +template +class qtextedit_sink : public base_sink { public: - qtextedit_sink(QTextEdit *textedit = nullptr) - { - if (textedit != nullptr) - { - textedit_p = std::make_shared<_spdlog_p::_sinks_p::qtextedit_sink_p>(textedit); - } - else - { - throw spdlog_ex("Error opening QTextEdit"); - } + qtextedit_sink(QTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + qtextedit_ = textedit; + } else { + throw spdlog_ex("Error opening QTextEdit"); } + } - ~qtextedit_sink() - { - flush_(); - } + ~qtextedit_sink() { flush_(); } protected: - void sink_it_(const details::log_msg &msg) override - { - memory_buf_t formatted; - base_sink::formatter_->format(msg, formatted); - string_view_t str_v = string_view_t(formatted.data(), formatted.size()); - textedit_p->append(str_v); - } + void sink_it_(const details::log_msg &msg) override { + memory_buf_t formatted; + base_sink::formatter_->format(msg, formatted); + string_view_t str = string_view_t(formatted.data(), formatted.size()); + QMetaObject::invokeMethod(qtextedit_,"append", Qt::AutoConnection, Q_ARG(QString, QString::fromUtf8(str.data(), static_cast(str.size())).trimmed())); + } - void flush_() override {} + void flush_() override {} private: - std::shared_ptr<_spdlog_p::_sinks_p::qtextedit_sink_p> textedit_p = nullptr; + QTextEdit* qtextedit_ = nullptr; }; // // qplaintextedit_sink class // -template -class qplaintextedit_sink : public base_sink -{ +template +class qplaintextedit_sink : public base_sink { public: - qplaintextedit_sink(QPlainTextEdit *textedit = nullptr) - { - if (textedit != nullptr) - { - textedit_p = std::make_shared<_spdlog_p::_sinks_p::qplaintextedit_sink_p>(textedit); - } - else - { + qplaintextedit_sink(QPlainTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + qplaintextedit_ = textedit; + } else { throw spdlog_ex("Error opening QPlainTextEdit"); } } - ~qplaintextedit_sink() - { - flush_(); - } + ~qplaintextedit_sink() { flush_(); } protected: - void sink_it_(const details::log_msg &msg) override - { + void sink_it_(const details::log_msg &msg) override { memory_buf_t formatted; base_sink::formatter_->format(msg, formatted); - string_view_t str_v = string_view_t(formatted.data(), formatted.size()); - textedit_p->append(str_v); + string_view_t str = string_view_t(formatted.data(), formatted.size()); + QMetaObject::invokeMethod(qplaintextedit_, "appendPlainText", Qt::AutoConnection, Q_ARG(QString, QString::fromUtf8(str.data(), static_cast(str.size())).trimmed())); } void flush_() override {} private: - std::shared_ptr<_spdlog_p::_sinks_p::qplaintextedit_sink_p> textedit_p = nullptr; + QPlainTextEdit* qplaintextedit_ = nullptr; }; #include "spdlog/details/null_mutex.h" @@ -174,27 +91,35 @@ using qplaintextedit_sink_st = qplaintextedit_sink; // // Factory functions // -template -inline std::shared_ptr qtextedit_logger_mt(const std::string &logger_name, QTextEdit *qtextedit = nullptr) -{ - return Factory::template create(logger_name, qtextedit); +template +inline std::shared_ptr +qtextedit_logger_mt(const std::string &logger_name, + QTextEdit *qtextedit = nullptr) { + return Factory::template create(logger_name, + qtextedit); } -template -inline std::shared_ptr qtextedit_logger_st(const std::string &logger_name, QTextEdit *qtextedit = nullptr) -{ - return Factory::template create(logger_name, qtextedit); +template +inline std::shared_ptr +qtextedit_logger_st(const std::string &logger_name, + QTextEdit *qtextedit = nullptr) { + return Factory::template create(logger_name, + qtextedit); } -template -inline std::shared_ptr qplaintextedit_logger_mt(const std::string &logger_name, QPlainTextEdit *qplaintextedit = nullptr) -{ - return Factory::template create(logger_name, qplaintextedit); +template +inline std::shared_ptr +qplaintextedit_logger_mt(const std::string &logger_name, + QPlainTextEdit *qplaintextedit = nullptr) { + return Factory::template create(logger_name, + qplaintextedit); } -template -inline std::shared_ptr qplaintextedit_logger_st(const std::string &logger_name, QPlainTextEdit *qplaintextedit = nullptr) -{ - return Factory::template create(logger_name, qplaintextedit); +template +inline std::shared_ptr +qplaintextedit_logger_st(const std::string &logger_name, + QPlainTextEdit *qplaintextedit = nullptr) { + return Factory::template create(logger_name, + qplaintextedit); } } // namespace spdlog