#include "logwindow.h" #include "ui_logwindow.h" LogWindow::LogWindow(QWidget *parent) : QDialog(parent), ui(new Ui::LogWindow) { ui->setupUi(this); setWindowTitle("LinkScope - Log"); tableModel=new QStandardItemModel(this);//创建表格数据 ui->tb_log->setModel(tableModel);//绑定表格数据 ui->tb_log->horizontalHeader()->setMinimumSectionSize(150);//设置最小列宽 ui->tb_log->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);//列宽可由用户调整 ui->tb_log->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);//行高自动拉伸 ui->tb_log->verticalHeader()->hide();//隐藏垂直表头,否则滚动语句执行时间较长 drawTableHeader();//设置表头 } LogWindow::~LogWindow() { delete ui; delete tableModel; } //添加一条日志 void LogWindow::addLog(char attr, const QString &tag, const QString &msg, qulonglong time, const QString &func) { //计算日志类型字符对应的颜色和属性名 QColor textColor=Qt::black; QString attrText="Unknown"; switch(attr) { case 'i': textColor=QColor("#218B47"); attrText="Info"; break; case 'd': textColor=QColor("#0046EB"); attrText="Debug"; break; case 'w': textColor=QColor("#FF8C00"); attrText="Warn"; break; case 'e': textColor=QColor("#EB005F"); attrText="Error"; break; } //创建各单元格数据 QList items; items<setForeground(QBrush(textColor));//设置文字颜色 items[i]->setFlags(Qt::ItemIsEnabled);//设置为不可编辑 } //若当前表格滚动到底端则在插入新行后自动滚动到底端 bool scrollAtEnd=ui->tb_log->verticalScrollBar()->value()==ui->tb_log->verticalScrollBar()->maximum(); tableModel->insertRow(tableModel->rowCount(),items);//在表格末尾插入新行 if(scrollAtEnd) ui->tb_log->scrollToBottom(); } //清空所有日志 void LogWindow::clearLog() { QByteArray horiHeaderState=ui->tb_log->horizontalHeader()->saveState();//记录列宽 tableModel->clear(); drawTableHeader(); ui->tb_log->horizontalHeader()->restoreState(horiHeaderState);//恢复列宽 } //绘制表头 void LogWindow::drawTableHeader() { tableModel->setColumnCount(5); tableModel->setHeaderData(0,Qt::Horizontal,"类型"); tableModel->setHeaderData(1,Qt::Horizontal,"TAG"); tableModel->setHeaderData(2,Qt::Horizontal,"MSG"); tableModel->setHeaderData(3,Qt::Horizontal,"时间戳"); tableModel->setHeaderData(4,Qt::Horizontal,"函数名"); } //将表格数据导出到CSV文件 bool LogWindow::exportCSV(const QString &filename) { QFile file(filename); if(!file.open(QFile::WriteOnly)) return false; QTextStream outStream(&file);//使用流方式输出 outStream<<"Type,TAG,MSG,Timestamp,Function\n"; for(int row=0;rowrowCount();row++) { for(int col=0;colcolumnCount();col++) outStream<item(row,col)->text()<<','; outStream<<'\n'; } return true; } //清空日志按钮点击 void LogWindow::on_bt_clear_clicked() { clearLog(); } //导出日志按钮点击 void LogWindow::on_bt_export_clicked() { //弹出文件选择框 QFileDialog *fileDialog = new QFileDialog(this); fileDialog->setWindowTitle(QStringLiteral("选中文件")); fileDialog->setDirectory("."); fileDialog->setNameFilter(tr("CSV File (*.csv)")); fileDialog->setFileMode(QFileDialog::AnyFile); fileDialog->setViewMode(QFileDialog::Detail); if(fileDialog->exec())//等待用户选择文件 { QStringList fileList=fileDialog->selectedFiles(); QString fileName=fileList.at(0); if(!fileName.endsWith(".csv"))//若用户输入的文件名不以csv结尾则加上后缀 fileName.append(".csv"); QFileInfo file(fileName);//判断是否已经存在文件,若存在则弹出覆盖警告框 if(file.exists()) { QMessageBox messageBox(QMessageBox::NoIcon,"警告", "文件已存在,是否覆盖?",QMessageBox::Yes | QMessageBox::No, NULL); if(messageBox.exec()!=QMessageBox::Yes) return; } if(!exportCSV(fileName))//将数据写入文件 { QMessageBox::information(this,"错误","文件打开失败,请检查文件是否被占用"); } } }