C++程序开发过程中,程序的入口一般是main函数也是主函数,然后才会在main函数中调用其他的类对象使程序运行起来。
一个软件程序一般是由很多类对象组合而成的,程序运行过程中对象之间要相互通信,也就是互相调用,互相配合才能很好的使整个程序软件运行起来。
在软件开发领域描述类与类之间的关系的是UML类图,类与类之间的关系请看我的文章C++类与类之间的关系,文章里面讲了6中常见类与类之间的关系。
但是对象与对象之间的通信关系是通过时序图也就是顺序图来表示的。
顺序图是一种强调对象间消息传递次序的交互图,又称为时序图或序列图。描述了在一个用例或操作的执行过程中对象如何通过消息相互交互,说明了消息如何在对象之间被发送和接收以及发送的顺序。它着重显示了参与相互作用的对象和所交换消息的顺序。
时序图主要有4中要素:对象、生命线、激活状态、消息。
下面通过一个简单的例子展现类图和顺序图。这个Demo实现的主要功能:主界面通过一个线程来加载SVG图片。
1.定义接口:
#pragma once
class IReadSvg {
public:
IReadSvg();
~IReadSvg();
virtual void readSvg() = 0;
};
#include "IReadSvg.h"
IReadSvg::IReadSvg() {
}
IReadSvg::~IReadSvg() {
}
2.主界面继承接口类并且实现接口
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_Thread.h"
#include "IReadSvg.h"
class QtThread;
class Thread : public QMainWindow,public IReadSvg {
Q_OBJECT
public:
Thread(QWidget *parent = Q_NULLPTR);
void readSvg()override;
private slots:
void slotReadSvg();
private:
Ui::ThreadClass ui;
QtThread* _thread = nullptr;
};
#include "Thread.h"
#include "QtThread.h"
#include <QDebug>
Thread::Thread(QWidget *parent)
: QMainWindow(parent) {
ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(slotReadSvg()));
_thread = new QtThread(this, this);
}
void Thread::readSvg() {
qDebug() << QStringLiteral("开始加载SVG图片");
}
void Thread::slotReadSvg() {
_thread->start();
}
3.定义线程
#pragma once
#include <QThread>
class IReadSvg;
class QtThread : public QThread {
Q_OBJECT
public:
QtThread(IReadSvg* read,QObject *parent);
~QtThread();
private:
void run()override;
private:
IReadSvg* _readSvg = nullptr;
};
#include "QtThread.h"
#include "IReadSvg.h"
QtThread::QtThread(IReadSvg* read, QObject *parent)
: QThread(parent) {
_readSvg = read;
}
QtThread::~QtThread() {
}
void QtThread::run() {
_readSvg->readSvg();
}
当点击主界面按钮的时候,就会启动线程,然后就会就会加载主界面实现的接口函数进行加载SVG函数。