北京网站建设制作开发,中国没公司怎么做网站,国内知名网站建设公司,wordpress 文章菜单需求#xff1a;
不同线程#xff0c;或者同一线程的不同类之间通信#xff0c;按照Qt的机制#xff0c;定义一个信号#xff0c;一个槽#xff0c;然后绑定。以两个类A,B为例#xff0c;A触发一个信号#xff0c;B执行一个槽#xff0c;在定义好信号和槽之后#x…需求
不同线程或者同一线程的不同类之间通信按照Qt的机制定义一个信号一个槽然后绑定。以两个类A,B为例A触发一个信号B执行一个槽在定义好信号和槽之后需要在另一处将两个类的信号和槽进行绑定。如果模块特别多绑了绑去 略显麻烦耦合性太高。
此处分享一个类别人写的忘记了在哪看到的。可以将上述问题解决降低耦合性。 使用
1A B两个类都需要包含头文件。#include PSEventController.h
2, A类中触发的地方调用publish函数。
//比如按下按钮 需提供一个唯一的标识字符串可自定义参数
PSEventController::publish(actionName.toLatin1(),Q_ARG(bool,isChecked));
3B类中 定义 on_psEvent_xxx 函数并实现。
//此处的addLine 即为上述pulish 函数中的第一个参数isChecked 为publis中的第二个参数
void on_psEvent_addLine(bool isChecked);
4B类中初始化的时候 执行 subscribe 函数。
PSEventController::subscribe(this,addLine);
这样A 和B 两个类 发布和订阅的唯一字符串标识符只要一致A 在pubsh 的时候 B 就可以subscribe到并且A 和B 完全耦合相互不可见。 具体代码
//PSEventController.h
#ifndef PSEVENTCONTROLLER_H
#define PSEVENTCONTROLLER_H#include QObject
#include QReadWriteLock
#include QMap
#include QList#define METHOD_PREFIX on_psEvent_class PSEventController : public QObject
{Q_OBJECT
public:static void unSubscribe(QObject* listener, const QByteArray eventName);static bool subscribe(QObject* listener, const QByteArray eventName);static bool publish(const QByteArray eventName, Qt::ConnectionType connectionType,QGenericArgument val0 QGenericArgument(), QGenericArgument val1 QGenericArgument(),QGenericArgument val2 QGenericArgument(), QGenericArgument val3 QGenericArgument(),QGenericArgument val4 QGenericArgument(), QGenericArgument val5 QGenericArgument(),QGenericArgument val6 QGenericArgument(), QGenericArgument val7 QGenericArgument(),QGenericArgument val8 QGenericArgument(), QGenericArgument val9 QGenericArgument());static inline bool publish(const QByteArray eventName,QGenericArgument val0 QGenericArgument(), QGenericArgument val1 QGenericArgument(),QGenericArgument val2 QGenericArgument(), QGenericArgument val3 QGenericArgument(),QGenericArgument val4 QGenericArgument(), QGenericArgument val5 QGenericArgument(),QGenericArgument val6 QGenericArgument(), QGenericArgument val7 QGenericArgument(),QGenericArgument val8 QGenericArgument(), QGenericArgument val9 QGenericArgument()){return publish(eventName, Qt::AutoConnection, val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);}static inline QString get_Errors(){return ps_LastError_;}static inline void clearEvents(){QWriteLocker locker(ps_Lock_);psEvents_pool_.clear();}static inline QByteArray methodFormatting(const QByteArray eventName) {return METHOD_PREFIX eventName;}
private:static QMapQByteArray, QListQObject* psEvents_pool_;static QReadWriteLock ps_Lock_;static QString ps_LastError_;
};#endif // PSEVENTCONTROLLER_H//PSEventController.cpp
#include PSEventController.h
#include QWriteLockerQMapQByteArray, QListQObject* PSEventController::psEvents_pool_;
QReadWriteLock PSEventController::ps_Lock_;
QString PSEventController::ps_LastError_;void PSEventController::unSubscribe(QObject* listener, const QByteArray eventName)
{QWriteLocker locker(ps_Lock_);int index -1;if (psEvents_pool_.contains(eventName) (index psEvents_pool_[eventName].indexOf(listener)) 0 index psEvents_pool_[eventName].count())psEvents_pool_[eventName].takeAt(index);
}bool PSEventController::subscribe(QObject* listener, const QByteArray eventName)
{QWriteLocker locker(ps_Lock_);if (psEvents_pool_.contains(eventName)) {if (-1 ! psEvents_pool_[eventName].indexOf(listener)) {ps_LastError_ QString(This object is subscribed to this eventName);return false;}psEvents_pool_[eventName].push_back(listener);return true;} else {psEvents_pool_.insert(eventName, { listener });return true;}
}bool PSEventController::publish(const QByteArray eventName, Qt::ConnectionType connectionType,QGenericArgument val0, QGenericArgument val1, QGenericArgument val2, QGenericArgument val3,QGenericArgument val4, QGenericArgument val5, QGenericArgument val6, QGenericArgument val7,QGenericArgument val8, QGenericArgument val9)
{QReadLocker locker(ps_Lock_);if (!psEvents_pool_.contains(eventName)) {ps_LastError_ QString(No objects subscribe to this eventName);return false;}auto methodName methodFormatting(eventName);QStringList errors;for (auto listener : psEvents_pool_[eventName]) {if (!listener)continue;auto ret QMetaObject::invokeMethod(listener, methodName, connectionType,val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);if (!ret)errors.append(QString(%1:%2).arg(listener-metaObject()-className()).arg(listener-objectName()));}if (errors.isEmpty())return true;ps_LastError_ QString(%1 execution failed:[\n).arg(QString(eventName));for (auto err : errors)ps_LastError_ QString(%1;\n).arg(err);ps_LastError_ ]\n;return false;
}