1:把qDebug信息打印到QT 窗口
2:把qDebug信息保存到本地
3:执行shell脚本
4:把终端信息输出到QT窗口
先上代码:
#include "logbrowser.h"
#include <QApplication>
#include <QPointer>
#include <QDebug>
QPointer<LogBrowser> log_broswer;
void myMessageOutput(QtMsgType type,const char *msg)
{
if(log_broswer)
log_broswer->outputMessage(type,msg);
}
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
log_broswer = new LogBrowser;
log_broswer->show();
qInstallMsgHandler(myMessageOutput);
int result = a.exec();
delete log_broswer;
return result;
}
#ifndef LOGBROWSER_H
#define LOGBROWSER_H
#include <QWidget>
#include <QTextBrowser>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QtDebug>
#include <QMessageBox>
#include <QCloseEvent>
#include <QProcess>
#include <QFileSystemWatcher>
#include <QDir>
#include <QTimer>
namespace Ui {
class LogBrowser;
}
class LogBrowser : public QWidget
{
Q_OBJECT
public:
explicit LogBrowser(QWidget *parent = 0);
~LogBrowser();
void outputMessage(QtMsgType type,const QString &msg);
public slots:
void start();
void save(bool enable);
void directoryUpdated(const QString &path); // 目录更新时调用,path是监控的路径
private slots:
void on_pushButton_start_clicked();
void on_pushButton_stop_clicked();
void on_pushButton_save_clicked();
void on_pushButton_exit_clicked();
void autoUpdata();
void on_pushButton_updata_clicked();
void displayUdiskFileList();
void readCmdInformation();
private:
Ui::LogBrowser *ui;
QTextBrowser *browser;
QPushButton *start_button;
QPushButton *clear_button;
QProcess *my_process;
QFileSystemWatcher *my_sysWatcher;
QTimer *my_timer;
bool is_finished;
bool my_saveEnable;
};
#endif // LOGBROWSER_H
#include "logbrowser.h"
#include "ui_logbrowser.h"
LogBrowser::LogBrowser(QWidget *parent) :
QWidget(parent),ui(new Ui::LogBrowser)
{
ui->setupUi(this);
//背景透明
setAutoFillBackground(false);
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground,true);
my_timer = new QTimer();
my_process = new QProcess(); //执行命令的进程
//当有输出时,发出消息。接收槽会读取进程管道内的数据
connect(my_process,SIGNAL(readyRead()),this,SLOT(readCmdInformation()));
my_sysWatcher = new QFileSystemWatcher();
my_sysWatcher->addPath("/mnt"); //监控文件夹路径
//如果文件夹有变动,则发出通知
connect( my_sysWatcher,SIGNAL(directoryChanged(QString)),SLOT(directoryUpdated(QString)));
ui->pushButton_updata->setEnabled(false);
is_finished = false;
my_saveEnable = false;
}
LogBrowser::~LogBrowser()
{
delete ui;
}
//! 读取命令窗口的信息,显示在自己的窗口上
void LogBrowser::readCmdInformation()
{
QString str = my_process->readAllStandardOutput();
ui->plainTextEdit->appendPlainText( str );
ui->plainTextEdit->moveCursor(QTextCursor::End);
}
//!接收debug 底层信息
void LogBrowser::outputMessage(QtMsgType type,const QString &msg)
{
QString message;
switch(type)
{
case QtDebugMsg:
message = QString("Debug:");
break;
case QtWarningMsg:
message = QString("Warning:");
break;
case QtCriticalMsg:
message = QString("Critical:");
break;
case QtFatalMsg:
message = QString("Fatal:");
break;
}
ui->plainTextEdit->appendPlainText(message.append(msg) );
ui->plainTextEdit->moveCursor(QTextCursor::End); //滑动条移动到底端
if( my_saveEnable )
{
QFile file("log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close();
}
}
//一个测试函数,正常使用时,可以删除
void LogBrowser::start()
{
for(int i=0; i<1000000; i++)
{
if(!is_finished)
{
QCoreApplication::processEvents();
qDebug()<<QString("qDebug::").append(QString::number(i,10));
}else{
return;
}
}
}
//!打开保存开关,则所有DEBUG信息保存到log.txt文件中
void LogBrowser::save(bool enable)
{
my_saveEnable = enable;
}
//! 自动升级,也就是自动执行脚本。
void LogBrowser::autoUpdata()
{
ui->plainTextEdit->appendPlainText("Auto UpData start!!!\r\n" );
my_process->start("/mnt/sda1/auto.sh");
// my_process->start("/home/lbs_work/test.sh");
}
//! 当有U盘插入时,则读取文件目录,并打开更新
void LogBrowser::directoryUpdated(const QString &path)
{
const QDir dir(path);
QStringList newEntryList = dir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files,QDir::DirsFirst);
if( newEntryList.contains("sda1"))
{
ui->plainTextEdit->setPlainText("U disk has been mounted");
emit my_timer->singleShot(2000,SLOT(displayUdiskFileList()));
ui->pushButton_updata->setEnabled( true );
}else{
ui->plainTextEdit->setPlainText("U disk has been unmounted");
ui->pushButton_updata->setEnabled(false);
}
}
//! 显示U盘文件夹目录,这里需要延时,因为刚挂载U盘,马上读取是读不到任何东西的
void LogBrowser::displayUdiskFileList()
{
const QDir udir("/mnt/sda1");
QStringList uDiskList = udir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files,QDir::DirsFirst);
ui->plainTextEdit->appendPlainText(QString().setNum(uDiskList.length()));
for( int i = 0; i < uDiskList.length(); ++i )
{
ui->plainTextEdit->appendPlainText( uDiskList[i] );
}
}
void LogBrowser::on_pushButton_start_clicked()
{
is_finished = false;
this->start();
}
void LogBrowser::on_pushButton_stop_clicked()
{
is_finished = true;
}
void LogBrowser::on_pushButton_save_clicked()
{
this->save(true);
}
void LogBrowser::on_pushButton_exit_clicked()
{
this->close();
delete this; //这是重点
}
void LogBrowser::on_pushButton_updata_clicked()
{
this->autoUpdata();
}
一定要注意类与类之间的层次关系。