#include "QtHistoryLogList.h" #include "QScreen" #pragma execution_character_set("utf-8") QtHistoryLogList::QtHistoryLogList(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); this->setMouseTracking(true); ui.centralWidget->setMouseTracking(true); ui.frame->setMouseTracking(true); ui.title->setMouseTracking(true); ui.label_icon->setStyleSheet("image: url(./Icon/logo_Dongsheng.png);"); ui.pushButton_min->setText(""); ui.pushButton_close->setText(""); ui.pushButton_max->setText(""); ui.pushButton_min->setStyleSheet("background-color:transparent;image: url(./Icon/min_n.png);"); ui.pushButton_close->setStyleSheet("background-color:transparent;image: url(./Icon/close_n.png);"); ui.pushButton_max->setStyleSheet("background-color:transparent;image: url(./Icon/Max_n.png);"); connect(ui.pushButton_min, &QPushButton::clicked, [=]() { this->showMinimized(); qApp->processEvents(); }); connect(ui.pushButton_close, &QPushButton::clicked, [=]() { this->close(); qApp->processEvents(); }); QScreen* screen = QGuiApplication::primaryScreen(); QSize screenSize = screen->size(); static int screenWidth = screenSize.width(); static int screenHeight = screenSize.height(); qDebug() << "Screen resolution: " << screenWidth << "x" << screenHeight; static int maxClickedNum = 1; connect(ui.pushButton_max, &QPushButton::clicked, [=]() { if (maxClickedNum) { //ui.pushButton_max->setStyleSheet("background-color:transparent;image: url(Max_n.png);"); //ui.pushButton_max->setToolTip(tr("向下还原")); setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 this->showMaximized(); maxClickedNum = 0; } else { //ui.pushButton_max->setStyleSheet("background-color:transparent;image: url(Max_n.png);"); //ui.pushButton_max->setToolTip(tr("最大化")); setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 this->showNormal(); this->resize(screenWidth / 3 * 2, screenHeight / 3 * 2); this->move(screenWidth / 5, screenHeight / 5); maxClickedNum = 1; } qApp->processEvents(); }); setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 //this->showNormal(); this->resize(screenWidth / 3 * 2, screenHeight / 3 * 2); this->move(screenWidth / 5, screenHeight / 5); ui.lineEdit_match->setText(""); ui.pushButton_match->setStyleSheet("QPushButton{background-color:rgb(68, 74, 80);border-radius:10px;}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); //匹配内容 connect(ui.pushButton_match, &QPushButton::clicked, [=]() { ifKidLog = false; matchList.clear(); for (int i = 0; i < myhistoryLogList.size(); i++) { if (myhistoryLogList[i].contains(ui.lineEdit_match->text())) matchList.append(myhistoryLogList[i]); if (i % 100000 == 0) { qDebug() << "pushButton_match::" << i; qApp->processEvents(); } } check_qsLines.clear(); check_qsLines.append(matchList); //刷新log显示; ifSettingEdit = true; ui.plainTextEdit->clear(); ui.verticalScrollBar->setMaximum(check_qsLines.size()); if (check_qsLines.size() > pageLines) { for (int i = 0; i < pageLines; i++) ui.plainTextEdit->appendPlainText(check_qsLines[i]); lastBar = pageLines; } else { for (int i = 0; i < check_qsLines.size(); i++) ui.plainTextEdit->appendPlainText(check_qsLines[i]); lastBar = check_qsLines.size(); } ui.plainTextEdit->verticalScrollBar()->setValue(0); if (check_qsLines.size() > 0) { QString lineLast = check_qsLines.last(); qDebug() << "lineLast::" << lineLast; } qApp->processEvents(); ifSettingEdit = false; ifKidLog = true; QMessageBox::information(0, tr("提示"), tr("操作完成"), tr("确定")); }); ui.pushButton_writeMatch->setStyleSheet("QPushButton{background-color:rgb(68, 74, 80);border-radius:10px;}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); //写匹配 connect(ui.pushButton_writeMatch, &QPushButton::clicked, [=]() { QFile savefile; QStringList myFList;// = FUNCTIONList[i]; if (ui.lineEdit_match->text().contains("::")) myFList = ui.lineEdit_match->text().split("::"); else myFList.append(ui.lineEdit_match->text()); QString newQS; for (int s = 0; s < myFList.size(); s++) newQS += myFList[s] + "-"; QDir dir = QApplication::applicationDirPath(); QString currPath = dir.path(); QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz"); QString LogPath = currPath + "/historyLogList/" + tmpDate; QString newPath = LogPath + "_" + newQS + ".log"; savefile.setFileName(newPath); if (!savefile.open(QIODevice::WriteOnly | QIODevice::Append)) { QString erinfo = savefile.errorString(); return; } QTextStream out(&savefile); for (int j = 0; j < matchList.size(); j++) { out << "\r" << matchList[j]; if (j % 100000 == 0) { qDebug() << "pushButton_writeMatch::" << j; qApp->processEvents(); } } savefile.close(); qApp->processEvents(); QMessageBox::information(0, tr("提示"), tr("操作完成"), tr("确定")); }); connect(ui.verticalScrollBar, &QScrollBar::valueChanged, [=]() { int firstNum = 0; int lastNum = 0; if (ifKidLog == false) { if (myhistoryLogList.size() <= pageLines) return; //下翻 if (lastBar <= ui.verticalScrollBar->value()) { if (ui.verticalScrollBar->value() <= pageLines) return; ifSettingEdit = true; //下翻大幅 if ((lastBar + pageLines) < ui.verticalScrollBar->value()) { ui.plainTextEdit->clear(); firstNum = ui.verticalScrollBar->value(); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(myhistoryLogList[i]); lastBar = ui.verticalScrollBar->value(); ui.plainTextEdit->verticalScrollBar()->setValue(std::max(5, ui.plainTextEdit->verticalScrollBar()->maximum() - 20)); } else if ((lastBar + 3) < ui.verticalScrollBar->value()) { firstNum = ui.verticalScrollBar->value() - pageLines; firstNum = std::max(firstNum, 0); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; /*for(int i=0;i< firstNum-lastBar;i++) ui.plainTextEdit->c*/ ui.plainTextEdit->clear(); for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(myhistoryLogList[i]); lastBar = ui.verticalScrollBar->value(); ui.plainTextEdit->verticalScrollBar()->setValue(std::max(5, ui.plainTextEdit->verticalScrollBar()->maximum() - 20)); } else { lastNum = ui.verticalScrollBar->value() + 3; lastNum = std::min(lastNum, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; ui.plainTextEdit->clear(); for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(myhistoryLogList[i]); lastBar = ui.verticalScrollBar->value(); ui.plainTextEdit->verticalScrollBar()->setValue(ui.plainTextEdit->verticalScrollBar()->maximum() - 4); } } //上翻 else { if (ui.verticalScrollBar->maximum() - ui.verticalScrollBar->value() <= pageLines) return; ifSettingEdit = true; //上翻大幅 if ((lastBar - pageLines) > ui.verticalScrollBar->value()) { ui.plainTextEdit->clear(); firstNum = ui.verticalScrollBar->value(); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(myhistoryLogList[i]); lastBar = ui.verticalScrollBar->value(); } else if ((lastBar - 3) > ui.verticalScrollBar->value()) { firstNum = ui.verticalScrollBar->value() - pageLines; firstNum = std::max(firstNum, 0); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; /*for(int i=0;i< firstNum-lastBar;i++) ui.plainTextEdit->c*/ ui.plainTextEdit->clear(); for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(myhistoryLogList[i]); lastBar = ui.verticalScrollBar->value(); } else { firstNum = lastBar - 3; firstNum = std::max(firstNum, 0); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; ui.plainTextEdit->clear(); for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(myhistoryLogList[i]); lastBar = ui.verticalScrollBar->value(); } if (ui.verticalScrollBar->value() == 0) ui.plainTextEdit->verticalScrollBar()->setValue(4); ui.plainTextEdit->verticalScrollBar()->setValue(4); } } else { if (check_qsLines.size() <= pageLines) return; //下翻 if (lastBar <= ui.verticalScrollBar->value()) { if (ui.verticalScrollBar->value() <= pageLines) return; ifSettingEdit = true; //下翻大幅 if ((lastBar + pageLines) < ui.verticalScrollBar->value()) { ui.plainTextEdit->clear(); firstNum = ui.verticalScrollBar->value(); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(check_qsLines[i]); lastBar = ui.verticalScrollBar->value(); ui.plainTextEdit->verticalScrollBar()->setValue(std::max(5, ui.plainTextEdit->verticalScrollBar()->maximum() - 20)); } else if ((lastBar + 3) < ui.verticalScrollBar->value()) { firstNum = ui.verticalScrollBar->value() - pageLines; firstNum = std::max(firstNum, 0); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; /*for(int i=0;i< firstNum-lastBar;i++) ui.plainTextEdit->c*/ ui.plainTextEdit->clear(); for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(check_qsLines[i]); lastBar = ui.verticalScrollBar->value(); ui.plainTextEdit->verticalScrollBar()->setValue(std::max(5, ui.plainTextEdit->verticalScrollBar()->maximum() - 20)); } else { lastNum = ui.verticalScrollBar->value() + 3; lastNum = std::min(lastNum, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; ui.plainTextEdit->clear(); for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(check_qsLines[i]); lastBar = ui.verticalScrollBar->value(); ui.plainTextEdit->verticalScrollBar()->setValue(ui.plainTextEdit->verticalScrollBar()->maximum() - 4); } } //上翻 else { if (ui.verticalScrollBar->maximum() - ui.verticalScrollBar->value() <= pageLines) return; ifSettingEdit = true; //上翻大幅 if ((lastBar - pageLines) > ui.verticalScrollBar->value()) { ui.plainTextEdit->clear(); firstNum = ui.verticalScrollBar->value(); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(check_qsLines[i]); lastBar = ui.verticalScrollBar->value(); } else if ((lastBar - 3) > ui.verticalScrollBar->value()) { firstNum = ui.verticalScrollBar->value() - pageLines; firstNum = std::max(firstNum, 0); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; /*for(int i=0;i< firstNum-lastBar;i++) ui.plainTextEdit->c*/ ui.plainTextEdit->clear(); for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(check_qsLines[i]); lastBar = ui.verticalScrollBar->value(); } else { firstNum = lastBar - 3; firstNum = std::max(firstNum, 0); lastNum = std::min(firstNum + pageLines, ui.verticalScrollBar->maximum()); firstNum = lastNum - pageLines; ui.plainTextEdit->clear(); for (int i = firstNum; i < lastNum; i++) ui.plainTextEdit->appendPlainText(check_qsLines[i]); lastBar = ui.verticalScrollBar->value(); } if (ui.verticalScrollBar->value() == 0) ui.plainTextEdit->verticalScrollBar()->setValue(4); ui.plainTextEdit->verticalScrollBar()->setValue(4); } } //ifSettingEdit = false; qApp->processEvents(); ifSettingEdit = false; }); ui.plainTextEdit->verticalScrollBar()->setMaximum(pageLines); static int last_plainValue = 0; connect(ui.plainTextEdit->verticalScrollBar(), &QScrollBar::valueChanged, [=]() { if (ifSettingEdit) { return; } int m_value = ui.plainTextEdit->verticalScrollBar()->value(); int m = ui.verticalScrollBar->maximum(); if (ui.plainTextEdit->verticalScrollBar()->value() == 0) if (lastBar == ui.verticalScrollBar->maximum()) ui.verticalScrollBar->setValue(std::max(0, lastBar - pageLines - 3)); else ui.verticalScrollBar->setValue(std::max(0, lastBar - 3)); else if (ui.plainTextEdit->verticalScrollBar()->value() >= ui.plainTextEdit->verticalScrollBar()->maximum() - 2) if (lastBar < pageLines) ui.verticalScrollBar->setValue(std::min(ui.verticalScrollBar->maximum(), lastBar + ui.plainTextEdit->verticalScrollBar()->maximum() + 3)); else ui.verticalScrollBar->setValue(std::min(ui.verticalScrollBar->maximum(), lastBar + 3)); /*if (last_plainValue < m_value) { last_plainValue = m_value; ui.verticalScrollBar->setValue(std::max(0, lastBar + last_plainValue - m_value)); } else if (last_plainValue > m_value) { last_plainValue = m_value; ui.verticalScrollBar->setValue(std::min(ui.verticalScrollBar->maximum(), lastBar + last_plainValue - m_value)); }*/ /*qDebug() << "ui.verticalScrollBar value::" << ui.verticalScrollBar->value(); qDebug() << "verticalScrollBar::" << ui.plainTextEdit->verticalScrollBar()->value(); qDebug() << "verticalScrollBar:maximum:" << ui.plainTextEdit->verticalScrollBar()->maximum();*/ }); } void QtHistoryLogList::setData(QQueue historyLogList) { myhistoryLogList.clear(); //myhistoryLogList = historyLogList; for (int i = 0; i < historyLogList.size(); i++) myhistoryLogList.enqueue(historyLogList[i]); pageLines = 200; ui.plainTextEdit->clear(); ifSettingEdit = true; ui.verticalScrollBar->setMaximum(myhistoryLogList.size()); if (myhistoryLogList.size() > pageLines) { for (int i = 0; i < pageLines; i++) ui.plainTextEdit->appendPlainText(myhistoryLogList[i]); lastBar = pageLines; } else { for (int i = 0; i < myhistoryLogList.size(); i++) ui.plainTextEdit->appendPlainText(myhistoryLogList[i]); lastBar = myhistoryLogList.size(); } ui.plainTextEdit->verticalScrollBar()->setValue(0); if (myhistoryLogList.size() > 0) { QString lineLast = myhistoryLogList.last(); qDebug() << "lineLast::" << lineLast; } qApp->processEvents(); ifSettingEdit = false; } QtHistoryLogList::~QtHistoryLogList() {} #define MOUSE_MARGIN 2 //计算鼠标位置 QtHistoryLogList::MousePoss QtHistoryLogList::calcmouseposs(QPoint p) { QtHistoryLogList::MousePoss mp; if (p.x() < MOUSE_MARGIN && p.y() < MOUSE_MARGIN) mp = QtHistoryLogList::MousePoss::LeftUp; //左上 else if (p.x() > MOUSE_MARGIN && p.y() < MOUSE_MARGIN && p.x() < this->width() - MOUSE_MARGIN) mp = QtHistoryLogList::MousePoss::Up; //上 else if (p.x() > this->width() - MOUSE_MARGIN && p.y() < MOUSE_MARGIN) mp = QtHistoryLogList::MousePoss::RightUp; //右上 else if (p.x() > this->width() - MOUSE_MARGIN && p.y() > MOUSE_MARGIN && p.y() < this->height() - MOUSE_MARGIN) mp = QtHistoryLogList::MousePoss::Right; //右 else if (p.x() > this->width() - MOUSE_MARGIN && p.y() > this->height() - MOUSE_MARGIN) mp = QtHistoryLogList::MousePoss::RightDown; //右下 else if (p.x() > MOUSE_MARGIN && p.x() < this->width() - MOUSE_MARGIN && p.y() > this->height() - MOUSE_MARGIN) mp = QtHistoryLogList::MousePoss::Down; //下 else if (p.x() < MOUSE_MARGIN && p.y() > this->height() - MOUSE_MARGIN) mp = QtHistoryLogList::MousePoss::LeftDown; //左下 else if (p.x() < MOUSE_MARGIN && p.y() < this->height() - MOUSE_MARGIN && p.y() > MOUSE_MARGIN) mp = QtHistoryLogList::MousePoss::Left; //左 else mp = QtHistoryLogList::MousePoss::Middle; //中间 return mp; } //修改鼠标样式 void QtHistoryLogList::setCursorType(QtHistoryLogList::MousePoss type) { Qt::CursorShape cursor; switch (type) { case QtHistoryLogList::MousePoss::LeftUp: case QtHistoryLogList::MousePoss::RightDown: cursor = Qt::SizeFDiagCursor; break; case QtHistoryLogList::MousePoss::Up: case QtHistoryLogList::MousePoss::Down: cursor = Qt::SizeVerCursor; break; case QtHistoryLogList::MousePoss::RightUp: case QtHistoryLogList::MousePoss::LeftDown: cursor = Qt::SizeBDiagCursor; break; case QtHistoryLogList::MousePoss::Right: case QtHistoryLogList::MousePoss::Left: cursor = Qt::SizeHorCursor; break; default: cursor = Qt::ArrowCursor; break; } setCursor(cursor); } //改变窗口的大小 void QtHistoryLogList::changeWindowSize(QtHistoryLogList::MousePoss type, QRect& wid, QPoint ptemp, int minWidth, int minHeight) { switch (type)//改变窗口的大小 { case QtHistoryLogList::MousePoss::LeftUp: { QPoint pos = wid.topLeft(); if (wid.width() > minWidth || ptemp.x() < 0) pos.rx() = pos.rx() + ptemp.x(); if (wid.height() > minHeight || ptemp.y() < 0) pos.ry() = pos.ry() + ptemp.y(); wid.setTopLeft(pos); break;//左上角 } case QtHistoryLogList::MousePoss::RightUp: { QPoint pos = wid.topRight(); if (wid.width() > minWidth || ptemp.x() > 0) pos.rx() = pos.rx() + ptemp.x(); if (wid.height() > minHeight || ptemp.y() < 0) pos.ry() = pos.ry() + ptemp.y(); wid.setTopRight(pos); break;//右上角 } case QtHistoryLogList::MousePoss::LeftDown: { QPoint pos = wid.bottomLeft(); if (wid.width() > minWidth || ptemp.x() < 0) pos.rx() = pos.rx() + ptemp.x(); if (wid.height() > minHeight || ptemp.y() > 0) pos.ry() = pos.ry() + ptemp.y(); wid.setBottomLeft(pos); break;//左下角 } case QtHistoryLogList::MousePoss::RightDown: { QPoint pos = wid.bottomRight(); if (wid.width() > minWidth || ptemp.x() > 0) pos.rx() = pos.rx() + ptemp.x(); if (wid.height() > minHeight || ptemp.y() > 0) pos.ry() = pos.ry() + ptemp.y(); wid.setBottomRight(pos); break;//右下角 } case QtHistoryLogList::MousePoss::Up: { int topY = wid.top(); if (wid.height() > minHeight || ptemp.y() < 0) topY = topY + ptemp.y(); wid.setTop(topY); break;//上 } case QtHistoryLogList::MousePoss::Left: { int leftX = wid.left(); if (wid.width() > minWidth || ptemp.x() < 0) leftX = leftX + ptemp.x(); wid.setLeft(leftX); break;//左 } case QtHistoryLogList::MousePoss::Right: { int rightX = wid.right(); if (wid.width() > minWidth || ptemp.x() > 0) rightX = rightX + ptemp.x(); wid.setRight(rightX); break;//右 } case QtHistoryLogList::MousePoss::Down: { int botY = wid.bottom(); if (wid.height() > minHeight || ptemp.y() > 0) botY = botY + ptemp.y(); wid.setBottom(botY); break;//下 } default: break; } } //三个鼠标事件的重写 void QtHistoryLogList::mousePressEvent(QMouseEvent* e) { if (e->button() == Qt::LeftButton) //鼠标左键按下 { m_lastPos = e->globalPos(); e->ignore(); } } //鼠标移动 void QtHistoryLogList::mouseMoveEvent(QMouseEvent* e) { //最大化状态,鼠标是否在标题栏,拖拽还原 if (this->isMaximized()) { if (ui.title->geometry().contains(this->mapFromGlobal(QCursor::pos())) && e->buttons() == Qt::LeftButton) { QPoint ptemp = e->globalPos(); if (ptemp != m_lastPos) { this->showNormal(); } } } QtHistoryLogList::MousePoss curPos = calcmouseposs(e->pos()); if (!e->buttons()) { setCursorType(curPos); mp_curPos = curPos; } if (e->buttons() == Qt::LeftButton) //坐标左键按下并移动 { QPoint ptemp = e->globalPos(); ptemp = ptemp - m_lastPos; //鼠标移动的偏移量 if (mp_curPos == QtHistoryLogList::MousePoss::Middle && ui.title->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_max->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_min->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_close->geometry().contains(this->mapFromGlobal(QCursor::pos()))) { move(ptemp + pos()); } else { QRect wid = geometry(); int minWidth = this->minimumWidth(); int minHeight = this->minimumHeight(); if (ptemp.x() < 50 && ptemp.x() > -50) { changeWindowSize(mp_curPos, wid, ptemp, minWidth, minHeight); //更新大小 setGeometry(wid); } } m_lastPos = e->globalPos(); } e->ignore(); } //鼠标释放 void QtHistoryLogList::mouseReleaseEvent(QMouseEvent* e) { if (e->button() == Qt::LeftButton && ui.title->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_max->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_min->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_close->geometry().contains(this->mapFromGlobal(QCursor::pos()))) //鼠标左键释放 { int dx = e->globalX() - m_lastPos.x(); int dy = e->globalY() - m_lastPos.y(); move(x() + dx, y() + dy); } QApplication::restoreOverrideCursor();//恢复鼠标指针性状 e->ignore(); }