首页 > 编程语言 >【Qt\C++】二维图形化故障树

【Qt\C++】二维图形化故障树

时间:2024-04-05 20:29:56浏览次数:333  
标签:return Qt items writer C++ 故障 QString 图形化 StandardTreeModel


文章目录


一、故障树是什么?

故障树是一种用于分析系统故障原因和影响的图形化工具。它将系统故障视为从基础事件开始的一系列逻辑路径,通过特定的逻辑关系和逻辑运算符连接不同的事件,形成树状结构。故障树的根节点代表了系统的顶级故障事件,叶节点代表了系统的基础事件或故障事件的最小发生概率。通过分析故障树的逻辑路径,可以确定导致系统故障的主要原因和潜在的影响,从而采取相应的措施来提高系统的可靠性和安全性。故障树分析常用于工程领域,尤其是在安全、可靠性和风险评估方面。

二、相关知识点

1、Qt的MVC模型使用以及如何自定义model
2、Qt的XML读写
3、Qt的二维图形视图的使用以及如何自定义Item

三、生成故障树

1、故障树节点

故障树节点,也称为故障树事件,是故障树分析中的一种元素,用于表示故障发生的可能性。故障树节点可以是基本事件、中间事件或顶事件。

底事件:表示已知的故障或故障模式,是故障树的叶子节点。基本事件可以是具体故障的发生,也可以是系统的性能指标达到一定条件。 例如:
电路故障
传感器故障
控制器故障

中间事件:表示发生故障的可能性,是故障树的非叶子节点。中间事件由其他事件组合而成,可以通过多个基本事件或中间事件进行逻辑运算得到。 例如:
电路短路
传感器失效
控制器错误

顶事件:表示整个系统发生故障的可能性,是故障树的根节点。顶事件可以通过多个中间事件进行逻辑运算得到。 例如:
系统崩溃
故障发生
故障树节点之间通过逻辑门(如与门、或门、非门)进行逻辑关系的连接,形成逻辑上的故障发生路径,从顶事件到基本事件的逻辑路径可以用来分析系统中故障产生的原因。

2、定义故障树的树状结构以及读取保存

1.使用QTreeView和QStandardItemModel来显示故障树

模型代码头文件:

#include <QStandardItemModel>
#include <QXmlStreamWriter>
#include "items.h"

#define ITEMTYPE Qt::UserRole + 1
#define FAULTMSG Qt::UserRole + 2

class StandardTreeModel : public QStandardItemModel
{
   
    Q_OBJECT
public:
    static items::ItemType toType(int i);
    enum Insert {
   AtTopLevel, AsChild};
    explicit StandardTreeModel(QObject *parent = 0);
    QStandardItem *insertIndex(Insert insert, const QString &name, const QModelIndex &index, items::ItemType type);
    void save(const QString &fileName);
    void load(const QString &fileName);
private:
    void clear();
    void initialize();
    QStandardItem *createNewIndex(QStandardItem *root, const QString &name, items::ItemType type);
    void writeIndexAndChildren(QXmlStreamWriter *writer, QStandardItem *root);
};

模型代码源文件:

#include "standardtreemodel.h"

#include <QFile>
#include <QXmlStreamWriter>
#include <QStack>
#include <QDebug>

items::ItemType StandardTreeModel::toType(int i)
{
   
    switch (i) {
   
    case 0:
        return items::topOr;
    case 1:
        return items::topAnd;
    case 2:
        return items::midOr;
    case 3:
        return items::midAnd;
    case 4:
        return items::bottom;
    }
    return items::unknown;
}

StandardTreeModel::StandardTreeModel(QObject *parent) : QStandardItemModel(parent)
{
   
    initialize();
}

void StandardTreeModel::initialize()
{
   
    setHorizontalHeaderLabels(QStringList() << "col1" << "col2");
}

void StandardTreeModel::clear()
{
   
    QStandardItemModel::clear();
    initialize();
}

QStandardItem *StandardTreeModel::insertIndex(StandardTreeModel::Insert insert, const QString &name, const QModelIndex &index, items::ItemType type)
{
   
    QStandardItem *parent = nullptr;
    if (insert == AtTopLevel)
    {
   
        parent = invisibleRootItem();
    }
    else if (insert == AsChild)
    {
   
        if (index.isValid())
        {
   
            parent = itemFromIndex(index);
        }
        else
            return 0;
    }
    return createNewIndex(parent, name, type);
}

QStandardItem *StandardTreeModel::createNewIndex(QStandardItem *root, const QString &name, items::ItemType type)
{
   
    QString str;
    switch (type) {
   
    case items::topAnd:
    case items::topOr:
        str = "顶事件";
        break;
    case items::midAnd:
    case items::midOr:
        str = "中间事件";
        break;
    case items::bottom:
        str = "底事件";
        break;
    default:
        break;
    }
    QStandardItem *nameItem = new QStandardItem(str);
    nameItem->setToolTip(name);
    nameItem->setData(type, ITEMTYPE);
    nameItem->setData(name, FAULTMSG);
    nameItem->setEditable(false);
    nameItem->setSelectable(true);
    root->appendRow(nameItem);
    return nameItem;
}

2.使用QXmlStreamReader和QXmlStreamWriter来保存故障树


void StandardTreeModel::save(const QString &fileName)
{
   
    if (fileName.isEmpty())
        return;
    QFile file(fileName);
    if (!file.open(QIODevice::WriteOnly|QIODevice::Text))
        return;
    QByteArray ary;
    QXmlStreamWriter writer(&ary);
    writer.setAutoFormatting(true);
    writer.writeStartDocument();
    writer.writeStartElement("Index");
    writer.writeAttribute("VERSION", "2.0");
    writeIndexAndChildren(&writer, invisibleRootItem());
    writer.writeEndElement();
    writer.writeEndDocument();
    file.write(ary);
    file.close();
}

void StandardTreeModel::writeIndexAndChildren(QXmlStreamWriter *writer, QStandardItem *root)
{
   
    if (root != invisibleRootItem()) {
   
        writer->writeStartElement("index");
        writer->writeAttribute(QString("type"), QString::number(root->data(ITEMTYPE).toInt()));
        writer->writeAttribute(QString("msg"), root->data(FAULTMSG).toString());
    }
    for (int row = 0; row < root->rowCount(); ++row)
        writeIndexAndChildren(writer, root->child(row, 0));
    if (root != invisibleRootItem())
        writer->writeEndElement();
}


void StandardTreeModel::load(const QString &fileName)
{
   
    if (fileName.isEmpty())
        return;
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly))
        return;
    QByteArray ary = file.readAll();
    clear();
    QStack<QStandardItem*> stack;
    stack.push(invisibleRootItem());
    QXmlStreamReader reader(ary);
    while (!reader.atEnd()) {
   
        reader.

标签:return,Qt,items,writer,C++,故障,QString,图形化,StandardTreeModel
From: https://blog.csdn.net/Mrack/article/details/137407420

相关文章

  • [C++][C++11][智能指针]分析详解 + 代码模拟
    目录0.智能指针三要素:)1.为什么需要智能指针?2.内存泄漏1.什么是内存泄漏?内存泄漏的危害?2.内存泄漏分类(了解)3.如何检测内存泄漏4.如何避免内存泄漏3.RAII4.智能指针原理5.auto_ptr(失败设计)6.unique_ptr7.shared_ptr1.实现原理:通过引用计数的方式来实现多个shared_ptr......
  • 蓝桥杯_省_21B_E_路径(c++)
    题目描述小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。小蓝的图由2021个结点组成,依次编号1至2021。对于两个不同的结点a,b,如果a和b的差的绝对值大于21,则两个结点之间没有边相连;如果a和b的差的绝对值小于等于21,则两个点之间......
  • 【Qt】:常用控件(五:显示类控件)
    常用控件一.ProgressBar二.CalendarWidget一.ProgressBar使⽤QProgressBar表⽰⼀个进度条代码⽰例:设置进度条按时间增⻓设置定时器,每个0.1秒,让进度条+1在实际开发中,进度条的取值,往往是根据当前任务的实际进度来进行设置的。比如需要读取一个很大的文......
  • 【Qt】:常用控件(四:显示类控件)
    常用控件一.Lable二.LCDNumber一.LableQLabel可以⽤来显⽰⽂本和图⽚.代码⽰例:显⽰不同格式的⽂本代码⽰例:显⽰图⽚此时,如果拖动窗⼝⼤⼩,可以看到图⽚并不会随着窗⼝⼤⼩的改变⽽同步变化为了解决这个问题,可以在Widget中重写resizeEvent函数。......
  • 类与对象(上)(C++)
    类的引入C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数。typedefintDataType;structStack{voidInit(size_......
  • c++ static_cast显式类型转换
    static_cast<>在C++中是一种用于执行显式类型转换的运算符,它在编译时检查类型转换的有效性,比C风格的强制转换(如(int)x)提供了更强的类型检查。基本类型之间的转换用于基本数据类型(如int、float、double等)之间的转换,使得不同类型的数据可以进行操作。inti=10;float......
  • 【c++小课堂】赋值语句与运算符
    赋值语句 赋值语句的介绍与格式赋值语句,我们在上期已经介绍过了,它就是用来给一个变量or常量一个值的。likethis:intq;q=100;格式:变量or常量=值奇奇怪怪的赋值懒人式赋值1,运算符+'='举个例子:inta;a=5;a+=4;//和a=a+4作用一样可以这样写的运算符有:+,-,*,/,%,>>......
  • 突破编程_C++_网络编程(TCPIP 四层模型(传输层))
    1传输层的功能与作用在TCP/IP四层模型中,传输层位于网络层之上和应用层之下,负责在源主机和目标主机之间提供端到端的可靠数据传输服务。传输层的主要功能与作用体现在以下几个方面:分段与重组:由于网络层的数据包大小有限制(如IP数据包的最大长度为65535字节),而应用层......
  • 突破编程_C++_网络编程(Windows 套接字(概述))
    1什么是Window套接字编程1.1基本概念Windows的套接字(Socket)是基于Windows操作系统的网络通信编程接口。它起源于UNIX系统的Berkeley套接字,但经过微软和第三方厂商的共同制定,形成了一套适用于Windows环境的标准,即WindowsSocket规范,简称WinSock。Windows......
  • Qt 处理excel
    处理Excel文件在Qt中通常涉及到使用第三方库,因为Qt本身并不直接支持Excel文件的读写。下面我将提供一个使用QAxObject(ActiveX封装)来操作Excel的基本代码示例。请注意,这个方法要求你的系统上安装有MicrosoftExcel。首先,确保你的Qt项目配置中包含了ActiveQt模块。在你的.pro文......