项目主进程接收报警后,将alarm msg 发送给代理, 并将其分发:

    else if (msg.name == "MesLCUalarmRep") {
QString errorText;
QXmlTools tool;
int status;
int code;
int severity;
if ( tool.setData(msg.body, errorText) ) {
QDomElement root = tool.getDocument()->documentElement();
QString tag = root.tagName();
if ( tag == "Body" ) {
QDomNode child = root.firstChild();
while ( !child.isNull() ) {
tag = child.toElement().tagName();
if ( tag == "STAT" ) {
QString text_status = child.toElement().text();
if( text_status == "MesInfo" ){
//return;
}
status = ( text_status.toUpper() == "MESON" ) ? : ;
}
else if ( tag == "ErrorType" ) {
severity = ( child.toElement().text().toUpper() == "HEAVY" ) ? : ;
}
else if ( tag == "ErrorMessage" ) {
errorText = child.toElement().text();
}
else if ( tag == "ErrorCode" ) {
code = atoi( child.toElement().text().toLatin1().data() );
}
child = child.nextSibling();
}
if(code == COMMONDEFECTALARMCODE || code == GLASSBROKENCALLCODE)
{
debug("enter common defect judge insertAlarm [%d] waitAlarmList.size:[%d]",code, waitAlarmList.size());
switchAlarmCode(code); }
sendAlarmDetail2GUI(errorText);
/**
*@projectName BoeB9Project
*@author Hasan
**/
void BoeB9QtmCellInlineMain::sendAlarmDetail2GUI(QString errorMsg)
{
mgrGlassMapCellInlineBoeB9Lst& GlassMapLst = mgrGlassMapCellInlineBoeB9Lst::GetInstance(); QString diffMsg = "4H"; QString errorTIme = QDateTime::currentDateTime().toString("yyyyMMdd-hh:mm:ss");
QString errorGls = GlassMapLst.GetJobGlassFromkey("GlsID"); if(errorGls == "") errorGls = "9AAB85001702a1";
else if(errorGls.size()< && errorGls != "") errorGls.append(" "); errorMsg = diffMsg + errorTIme + errorGls + errorMsg; sendMesGUIOperatorCallMsg(errorMsg);
}

代理将其分发后GUI接收此alarm, 并且将其在独立窗口显示:

void BoeB9InlineMainForm::showOperatorCallMsg(QString msg)
{
if(msg.startsWith("4H"))
showAlarmList(msg);
else
{
opCallDialog->insertMassge(msg);
opCallDialog->show();
}
}
void BoeB9InlineMainForm::showAlarmList(QString alarmMsg)
{
alarmListForm->addAlarmItem2List(alarmMsg.mid(, alarmMsg.size()-));
alarmListForm->show();
}

独立窗口代码如此,并且点击窗口上的confirm按钮,可以将其输出文件保存:

#include "alarmlistform.h"
#include "ui_alarmlistform.h"
#include <QMessageBox> AlarmListForm::AlarmListForm(QWidget *parent, Qt::WindowFlags) :
QWidget(parent),
ui(new Ui::AlarmListForm),
currentRow(-)
{
ui->setupUi(this);
setWindowTitle("Alarm List"); QString currentDay = QDateTime::currentDateTime().toString("yyyy-MM-dd");
QString filePath = SMCU_WORK_PATH "/";
filePath += currentDay;
filePath += "-alarmList.dat";
file = new QFile(filePath); } AlarmListForm::~AlarmListForm()
{
delete ui;
} void AlarmListForm::addAlarmItem2List(QString alarmMsg)
{
QListWidgetItem *item = new QListWidgetItem;
item->setText(alarmMsg);
ui->listWidget->addItem(item);
} void AlarmListForm::on_pushButton_clicked()
{
if(currentRow < )
return; showDetailAlarm(currentRow); currentRow = -;
} void AlarmListForm::on_listWidget_clicked(const QModelIndex &index)
{
currentRow = ui->listWidget->currentRow();
} void AlarmListForm::on_pushButton_2_clicked()
{
int count = ui->listWidget->count();
for(int index = count; index >= ; index --)
{
QListWidgetItem *item = ui->listWidget->takeItem(index);
delete item;
}
this->close();
} void AlarmListForm::on_listWidget_doubleClicked(const QModelIndex &index)
{
showDetailAlarm(ui->listWidget->currentRow());
} void AlarmListForm::showDetailAlarm(int row)
{
QListWidgetItem *item = ui->listWidget->item(row);
QString alarmDetail = item->text();
int ans = QMessageBox::question(this,
tr("Alarm Detail"),
tr(alarmDetail.toLatin1().data()),
QMessageBox::Save | QMessageBox::Cancel);
if(ans == QMessageBox::Save)
{
saveAlarm2File(alarmDetail);
delete item;
} } void AlarmListForm::saveAlarm2File(QString alarmMsg)
{
if(!file->isOpen())
{
if(file->open(QIODevice::Append | QIODevice::Text))
{
}
else
{
return;
} }
if(alarmMsg.size() <= )
{
QTextStream buff(file);
buff<<"<Time>" << "alarmMsg.left(10)" << "</Time>";
return;
}
QTextStream buff(file);
buff<<"<Time>" << alarmMsg.mid(, ) << "</Time>";
buff<<"<GlsID>" << alarmMsg.mid(, ) << "</GlsID>";
buff<<"<AlarmMsg>" << alarmMsg.mid(, alarmMsg.size()-) << "</AlarmMsg>";
buff<<endl; buff.flush();
file->close();
}

Qt 项目主进程接收Alarm 后在GUI上显示,并且可以有选择性输出文件的更多相关文章

  1. 研究Electron主进程、渲染进程、webview之间的通讯

    背景 由于某个Electron应用,需要主进程.渲染进程.webview之间能够互相通讯. 不过因为Electron仅提供了主进程与渲染进程的通讯,没有渲染进程之间或渲染进程与webview之间通讯的 ...

  2. Wndows 主进程(Rundll32)已停止工作

        打开电脑,出现"windows 主进程(Rundll32)已停止工作",百度了一下,是文件损坏了.     下载一个新的文件,替换即可,若遇到权限问题,使用魔方工具中的设置 ...

  3. 360等杀掉了app的主进程后 ,如何自动开启 如何防止被kill

    如何阻止360等进程查杀工具停止App后台进程安全软件优化内存时需要关闭没用的进程既然你同意使用360,,也允许了360的最高权限..那么他就有足够的权限来杀掉app后台进程. 一 如何保证app进程 ...

  4. Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.需求描述  Qt主进程启动 ...

  5. WPF工作笔记:本地化支持、主进程通知、两种最常用异步编程方式

    1.本地化支持 (1)重写控件默认的依赖属性LanguageProperty FrameworkElement.LanguageProperty.OverrideMetadata( typeof(Fr ...

  6. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

  7. 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

     1.启动nginx的方式: cd /usr/local/nginx ls ./nginx -c nginx.conf 2.查看nginx的进程方式: [root@localhost nginx] ...

  8. scrapy 源码解析 (二):启动流程源码分析(二) CrawlerProcess主进程

    CrawlerProcess主进程 它控制了twisted的reactor,也就是整个事件循环.它负责配置reactor并启动事件循环,最后在所有爬取结束后停止reactor.另外还控制了一些信号操作 ...

  9. 优化 Workerman 检查主进程是否存活的逻辑

    主要新增了判断进程是否为 Workerman 进程的逻辑,从而优化了确定主进程是否存活的准确性 发现问题 年前逛 GitHub 的时候,发现 Workerman 有一个 2017 年打开的 Issue ...

随机推荐

  1. Excellent JD

    Job description About the role We are looking for a talented engineer who has excellent cloud skills ...

  2. android webview 播放 video经验总结

    在目前PC浏览器上,对video的支持基本都没什么问题了.但是如果用webview去跑这样的页面就会遇到许多问题. 下面一段html <!DOCTYPE html> <html> ...

  3. editplus 格式化 js、html、xml、css

    没有文件扩展”js”的脚本引擎的问题的解决办法 解决办法如下: 打开注册表编辑器,定位"HKEY_CLASSES_ROOT" > ".js" 这一项,双击 ...

  4. python调用chrome打开指定网址

    #!/usr/bin/python # -*- coding:utf-8 -*- import os f = open("chrome_cmd_path.txt") chrome ...

  5. 合并两个数组 以KEY 作为键

    <?php     $a= array(         array(             'ID'=> 2         ) );   $b= array(         arr ...

  6. 浅谈js冒泡事件1

    什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这 ...

  7. Hive入门操作

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.本文描述了HIve的一些基本操作,如有错误之处还请指出. 常用语法 #显示相关信息 sh ...

  8. AngularJs学习笔记--Understanding the Controller Component

    原版地址:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model 在angular中,controller是一个javasc ...

  9. Ubuntu14.04安装PowerDNS踩坑实录

    公司要使用PowerDNS,作为内网域名解析的工具.让我和另一组的同事学一下如何配置及调优.所以先找了两台服务器试着安装一下.这一装就是一个礼拜,经历了大大小小的坑,记下来以后可能需要参考.安装过程如 ...

  10. SQL rownum的用法

    rownum只显示两行记录,第一行是字段名,第二行是满足查询条件的记录.