当然,以下是一个完整的示例,演示了如何在Qt中使用spdlog并将日志输出到界面上。
首先,确保你的Qt项目中包含了spdlog库,并正确引入头文件。
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPlainTextEdit>
#include <memory>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void onLogButtonClicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <spdlog/spdlog.h>
#include <spdlog/sinks/base_sink.h>
class QtLogSink : public spdlog::sinks::base_sink<std::mutex>
{
public:
explicit QtLogSink(QPlainTextEdit* logWidget) : logWidget_(logWidget) {}
protected:
void sink_it_(const spdlog::details::log_msg& msg) override
{
std::lock_guard<std::mutex> lock(mutex_);
QString logMessage = QString::fromStdString(msg.payload.data());
QMetaObject::invokeMethod(logWidget_, [this, logMessage]() {
logWidget_->appendPlainText(logMessage);
});
}
private:
QPlainTextEdit* logWidget_;
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化console logger
auto console_sink = std::make_shared<QtLogSink>(ui->plainTextEdit);
auto console_logger = std::make_shared<spdlog::logger>("console", console_sink);
// 将console logger设为全局默认logger
spdlog::set_default_logger(console_logger);
// 打印示例日志消息
SPDLOG_LOGGER_INFO(spdlog::get("console"), "Hello, spdlog!");
connect(ui->logButton, &QPushButton::clicked, this, &MainWindow::onLogButtonClicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onLogButtonClicked()
{
// 从文本框获取日志消息并打印
QString logMessage = ui->lineEdit->text();
SPDLOG_LOGGER_INFO(spdlog::get("console"), logMessage.toStdString());
}
mainwindow.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Qt+spdlog Demo</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item alignment="Qt::AlignHCenter|Qt::AlignTop">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item alignment="Qt::AlignRight|Qt::AlignTop">
<label name="label_2">
<text>Log Message:</text>
</label>
</item>
<item alignment="Qt::AlignLeft|Qt::AlignTop">
<lineEdit name="lineEdit"/>
</item>
</layout>
</item>
<item alignment="Qt::AlignHCenter|Qt::AlignTop">
<widget class="QPlainTextEdit" name="plainTextEdit"/>
</item>
<item alignment="Qt::AlignHCenter|Qt::AlignTop">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>50</number>
</property>
<property name="topMargin">
<number>20</number>
</property>
<item alignment="Qt::AlignRight|Qt::AlignVCenter">
<pushButton name="logButton">
<text>Log</text>
</pushButton>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect/>
</property>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="actionOpen"/>
<action name="actionSave"/>
<action name="actionQuit"/>
<add actionName="actionQuit"/>
<add actionName=""/>
<add actionName=""/>
</widget>
</ui>
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
以上是一个简单的示例,包含了一个主窗口,其中有一个文本框和一个按钮。当用户点击按钮时,日志消息将从文本框中获取并打印到日志窗口(QPlainTextEdit
)上。你可以根据需要对界面进行进一步的定制和扩展。
内容由零声教学AI助手提供,问题来源于学员提问