C++:实现多重继承时的最佳实践
C++ : Best practice when implementing Multiple inheritance
我必须将两种类型的图形项目(QGraphicsRectItem
和QGraphicsEllipseItem
)的倍数添加到QGraphicsScene
(添加到QGraphicsView
)。每个图形项都应能够与鼠标和键盘事件进行交互。所以最初我设计了如下类。
初始设计:
class myQGraphicsRectItem : public QGraphicsRectItem
{
public:
explicit myQGraphicsRectItem();
private:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void focusOutEvent(QFocusEvent *event);
//Many events goes here
void fnCreateRect();
};
class myQGraphicsRectItem : public QGraphicsEllipseItem
{
public:
explicit myQGraphicsRectItem();
private:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void focusOutEvent(QFocusEvent *event);
//Many events goes here
void fnCreateCircle();
};
为了了解如何避免重复的事件声明和定义,我阅读了以下答案:
- 多重继承不明确调用
- 模板仅在头文件中实现?
- 虚拟基类
最后设计了如下类。
修改设计:
头文件
template <class T>
class myQGraphicsRectItem : public QGraphicsRectItem , public QGraphicsEllipseItem{
/*commented the below event methods in the base classes*/
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void focusOutEvent(QFocusEvent *event);
//Many events goes here
}
实现文件
template <class T> myGraphicsItem<T>::myGraphicsItem()
{
this->T::setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsFocusable);
this->T::setFocus();
}
//**All event function definition goes here....**
template <class T> QGraphicsItem *myGraphicsItem<T>::fnGetRectObject()
{
fnCreateRect();
return (T*)this;
}
调用代码
#include "mygraphicsitem.h"
#include "mygraphicsitem.cpp"
void MainWindow::on_PushButton_clicked()
{
myGraphicsItem<myQGraphicsRectItem> *rr = new myGraphicsItem<myQGraphicsRectItem>();
scene->addItem(rr->fnGetRectObject());
}
应用程序通过此修改后的设计按预期工作。但我对这个设计有一些疑问,如下所示:
- 这是处理这种情况的最佳实践还是应该使用初始方法? 或者有任何其他最佳方法(编写单个代码来处理事件)?
QGraphicsRectItem
和QGraphicsEllipseItem
都继承自QAbstractGraphicsShapeItem
。那么我需要处理虚拟基类概念吗?
哇,这太想问题的解决方案了!
还有其他最好的方法(编写单个代码来处理事件)吗?
对我来说,这个问题不清楚您要实现的目标,可能是由于尝试的解决方案,因此我将假设使用两个类,QGraphicsRectItem
和 QGraphicsEllipseItem
,您正在尝试使用单个代码块来处理自定义事件,例如鼠标、键等。
在这种情况下,Qt为您提供了安装场景事件过滤器调用所需的一切。
只需创建一个派生自QGraphicsItem
的类,然后重新实现要处理的事件。然后将这个新类添加到其他实例中,installSceneEventFilter
class QGraphicsItemEventsFilter : public QGraphicsItem
{
private:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void focusOutEvent(QFocusEvent *event);
};
实例化筛选器并将其添加到其他类
QGraphicsItemEventsFilter* pFilter = new QGraphicsItemEventsFilter;
QGraphicsRectItem* pRect = new QGraphicsRectItem;
pRect->installSceneEventFilter(pFilter);
QGraphicsEllipseItem* pEllipse = new QGraphicsEllipseItem;
pEllipse->installSceneEventFilter(pFilter);
现在,pRect
和pEllipse
的所有事件都将由事件过滤器 pFilter 处理。
根据我对Qt的经验,一个一般的答案(没有详细阅读你的代码)是: 如果你认为你必须使用多重继承来处理Qt类和子类,那么你很可能做错了 - 这反过来又很可能表明你没有完全理解机制。Qt的设计非常好,如果你按照预期做事,你就不需要多重继承。
试着再想一想,去寻找你想要实现的例子。
相关文章:
- 实现无开销push_back的最佳方法是什么
- C++:实现向量和矩阵类的最佳结构
- 可以具有不同基成员实现的类的最佳实现
- 实现基于数字值(正、负、零)的条件表达式的最佳方法
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- 实现高分辨率计时器的最佳方法
- 实现后期多态性的最佳方法
- 在C++中实现双链表的最佳操作系统不可知方法
- C ++实现全局开关/标志以控制程序行为的最佳方法,而无需将类绑定到公共点
- 实现此"on error, throw"回调的最佳方法是什么?
- 在QGraphicsView上实现交互式样条曲线的最佳方法是什么?
- 在 Windows 中使用 boost::asio 实现最佳缓冲区大小
- 当您知道结构将来会更改时,实现结构读写的最佳方法是什么
- 在C 中实现此类工作流程的最佳方法
- 在C/C 中实现实时最佳拟合内存分配算法
- 在C++中实现哈希旋转方法的最佳方式是什么
- C++中矢量的最佳实现
- 全局变量的最佳实现
- 缺少一元std::copy的最佳实现
- 什么是VS2005的STL的最佳实现