diff --git a/include/spdlog/sinks/qt_sinks .h b/include/spdlog/sinks/qt_sinks .h new file mode 100644 index 00000000..1389b87b --- /dev/null +++ b/include/spdlog/sinks/qt_sinks .h @@ -0,0 +1,129 @@ +// Copyright(c) 2015-present, Gabi Melman, mguludag and spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +// +// Custom sink for QPlainTextEdit or QTextEdit and its childs(QTextBrowser... etc) +// Building and using requires Qt library. +// + +#include "spdlog/common.h" +#include "spdlog/details/log_msg.h" +#include "spdlog/details/synchronous_factory.h" +#include "spdlog/sinks/base_sink.h" + +#include +#include + +// +// qtextedit_sink class +// +namespace spdlog { +namespace sinks { +template +class qtextedit_sink : public base_sink { +public: + qtextedit_sink(QTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + qtextedit = textedit; + } else { + throw spdlog_ex("Error opening QTextEdit"); + } + } + + ~qtextedit_sink() { flush_(); } + +protected: + void sink_it_(const details::log_msg &msg) override { + if(qtextedit == nullptr) + return; + 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() - 2)))); + } + + void flush_() override {} + +private: + QTextEdit* qtextedit = nullptr; +}; + +// +// qplaintextedit_sink class +// +template +class qplaintextedit_sink : public base_sink { +public: + qplaintextedit_sink(QPlainTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + qplaintextedit = textedit; + } else { + throw spdlog_ex("Error opening QPlainTextEdit"); + } + } + + ~qplaintextedit_sink() { flush_(); } + +protected: + void sink_it_(const details::log_msg &msg) override { + if(qplaintextedit == nullptr) + return; + memory_buf_t formatted; + base_sink::formatter_->format(msg, formatted); + 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() - 2)))); + } + + void flush_() override {} + +private: + QPlainTextEdit* qplaintextedit = nullptr; +}; + +#include "spdlog/details/null_mutex.h" +#include +using qtextedit_sink_mt = qtextedit_sink; +using qtextedit_sink_st = qtextedit_sink; + +using qplaintextedit_sink_mt = qplaintextedit_sink; +using qplaintextedit_sink_st = qplaintextedit_sink; + +} // namespace sinks + +// +// 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_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_st(const std::string &logger_name, + QPlainTextEdit *qplaintextedit = nullptr) { + return Factory::template create(logger_name, + qplaintextedit); +} +} // namespace spdlog