一个项目中用“观察者”模式进行数据的发送与接收,用户接收数据的TrTableMaster类是一个QTableWidget的列表,同时继承了Observer,Observer的OnReceive,用于接收TrManager::notify发送的数据。
添加观察者:
// 这里的TrManager用的是单例模式, attach 是把Observer*插入到static_gObservers这个vector中。
#define TrAttach(Observer) TrManager::getInstance().attach(Observer)
// TrAttach可以在全局任何地方添加Observer观察者
TrAttach(reinterpret_cast<Observer*>(new TrTableMaster()));
// 这里用(Observer*)进行强制转换效果是一样的。
class Observer
{
public:
virtual void OnReceive(TrResponseID rId, void* wParam, void* lParam) = 0;
};
这里的TrTableMaster继承了两个类,QTableWidget和Observer,这里的继承顺序不能颠倒,先继承Observer就会报错。
class TrTableMaster : public QTableWidget, public Observer
{
Q_OBJECT
public:
explicit TrTableMaster(QWidget* parent = nullptr);
virtual void OnReceive(TrResponseID rId, void* wParam, void* lParam) override;
};
static std::vector<TrObserver*> static_gObservers;
void TrManager::notify(TrResponseID rId, void* wParam, void* lParam)
{
for (unsigned i = 0; i < static_gObservers.size(); ++i)
{
if (nullptr != static_gObservers[i])
{
// 打断点已经到了这里,也就是数据已经发送了, 但是TrTableMaster收不到数据,没有调用OnReceive
static_gObservers[i]->OnReceive(rId, wParam, lParam);
}
}
}
现在的问题是,通过上述步骤建立的观察者模式,到static_gObservers[i]->OnReceive(rId, wParam, lParam);这一步后,打断点已经到了OnReceive这里,没问题,但是TrTableMaster的OnReceive并没有调用到函数,也就是没有收到数据,由于项目涉及到QT,TrTableMaster先继承的QTableWidget,再继承Observer,导致添加观察者的时候必须进行类的强制转换,我猜是进行强制转换的时候出的问题(丢失了一些函数?),但是不知道要怎么处理才能达到想要的效果。
也就是说,TrTableMaster这个类必须继承QTableWidget,和Observer,而且顺序不能颠倒,会报错,在这样的情况下,TrTableMaster::OnReceive能收到通知者发送的数据就行。或者说还有其他的解决方案吗?
项目的地址我也贴出来方便指点一下:
https://gitee.com/xledoo/qtrader-master