#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; }