133 lines
3.6 KiB
C++
133 lines
3.6 KiB
C++
|
|
#include "DetectLogHelper.h"
|
|||
|
|
|
|||
|
|
DetectLogHelper::DetectLogHelper(QListView* listView, QObject *parent)
|
|||
|
|
: QObject(parent)
|
|||
|
|
, m_listView(listView)
|
|||
|
|
, m_logModel(nullptr)
|
|||
|
|
, m_lastLogCount(0)
|
|||
|
|
, m_timestampFormat("hh:mm:ss")
|
|||
|
|
, m_showTimestamp(true)
|
|||
|
|
, m_deduplicationEnabled(true)
|
|||
|
|
{
|
|||
|
|
if (m_listView) {
|
|||
|
|
// 创建并设置 QStringListModel
|
|||
|
|
m_logModel = new QStringListModel(this);
|
|||
|
|
m_listView->setModel(m_logModel);
|
|||
|
|
|
|||
|
|
// 设置 QListView 属性
|
|||
|
|
m_listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
|||
|
|
m_listView->setSelectionMode(QAbstractItemView::NoSelection);
|
|||
|
|
m_listView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
initConnections();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DetectLogHelper::~DetectLogHelper()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DetectLogHelper::initConnections()
|
|||
|
|
{
|
|||
|
|
// 连接信号槽,支持跨线程更新
|
|||
|
|
connect(this, &DetectLogHelper::logUpdateRequested,
|
|||
|
|
this, &DetectLogHelper::updateLogInUI,
|
|||
|
|
Qt::QueuedConnection);
|
|||
|
|
|
|||
|
|
connect(this, &DetectLogHelper::logClearRequested,
|
|||
|
|
this, &DetectLogHelper::clearLogInUI,
|
|||
|
|
Qt::QueuedConnection);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DetectLogHelper::appendLog(const QString& message)
|
|||
|
|
{
|
|||
|
|
// 通过信号槽机制,确保在UI线程中更新
|
|||
|
|
emit logUpdateRequested(message);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DetectLogHelper::clearLog()
|
|||
|
|
{
|
|||
|
|
// 通过信号槽机制,确保在UI线程中清空
|
|||
|
|
emit logClearRequested();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DetectLogHelper::setTimestampFormat(const QString& format)
|
|||
|
|
{
|
|||
|
|
m_timestampFormat = format;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DetectLogHelper::setShowTimestamp(bool show)
|
|||
|
|
{
|
|||
|
|
m_showTimestamp = show;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DetectLogHelper::setDeduplicationEnabled(bool enable)
|
|||
|
|
{
|
|||
|
|
m_deduplicationEnabled = enable;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QStringListModel* DetectLogHelper::model() const
|
|||
|
|
{
|
|||
|
|
return m_logModel;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DetectLogHelper::updateLogInUI(const QString& message)
|
|||
|
|
{
|
|||
|
|
if (!m_logModel || !m_listView) return;
|
|||
|
|
|
|||
|
|
// 获取当前数据
|
|||
|
|
QStringList logList = m_logModel->stringList();
|
|||
|
|
|
|||
|
|
// 构建日志条目
|
|||
|
|
QString logEntry;
|
|||
|
|
|
|||
|
|
if (m_deduplicationEnabled && message == m_lastLogMessage && !logList.isEmpty()) {
|
|||
|
|
// 相同消息,增加计数并替换最后一条
|
|||
|
|
m_lastLogCount++;
|
|||
|
|
|
|||
|
|
if (m_showTimestamp) {
|
|||
|
|
QString timestamp = QDateTime::currentDateTime().toString(m_timestampFormat);
|
|||
|
|
logEntry = QString("[%1] %2 (x%3)").arg(timestamp).arg(message).arg(m_lastLogCount);
|
|||
|
|
} else {
|
|||
|
|
logEntry = QString("%1 (x%2)").arg(message).arg(m_lastLogCount);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 替换最后一条
|
|||
|
|
logList[logList.size() - 1] = logEntry;
|
|||
|
|
} else {
|
|||
|
|
// 新消息,重置计数
|
|||
|
|
m_lastLogMessage = message;
|
|||
|
|
m_lastLogCount = 1;
|
|||
|
|
|
|||
|
|
if (m_showTimestamp) {
|
|||
|
|
QString timestamp = QDateTime::currentDateTime().toString(m_timestampFormat);
|
|||
|
|
logEntry = QString("[%1] %2").arg(timestamp).arg(message);
|
|||
|
|
} else {
|
|||
|
|
logEntry = message;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 添加新的日志条目
|
|||
|
|
logList.append(logEntry);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新模型
|
|||
|
|
m_logModel->setStringList(logList);
|
|||
|
|
|
|||
|
|
// 自动滚动到最底部
|
|||
|
|
if (!logList.isEmpty()) {
|
|||
|
|
QModelIndex lastIndex = m_logModel->index(logList.size() - 1);
|
|||
|
|
m_listView->scrollTo(lastIndex);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DetectLogHelper::clearLogInUI()
|
|||
|
|
{
|
|||
|
|
if (m_logModel) {
|
|||
|
|
m_logModel->setStringList(QStringList());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 重置日志计数器
|
|||
|
|
m_lastLogMessage.clear();
|
|||
|
|
m_lastLogCount = 0;
|
|||
|
|
}
|