C:实现多重继承时的最佳实践

我必须将两种类型的图形项(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();
};

要知道如何避免重复事件声明和定义,我会阅读以下答案:

> Multiple Inheritance Ambiguous Call
> Templates only be implemented in the header file?
> Virtual base class

最后设计了如下课程.

改良设计:

文件

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.那么我需要处理虚拟基类概念吗?

解决方法

哇,那是在思考解决问题的方法

any other best method is there (to write single code to handle events)?

对我来说,问题不清楚你想要实现什么,可能是由于尝试的解决方案,所以我将假设使用两个类,QGraphicsRectItem和QGraphicsEllipseItem,你试图有一个块用于处理自定义事件的代码,例如鼠标,键等.

在这种情况下,Qt为您提供了拨打installSceneEventFilter所需的一切.

只需创建一个派生自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处理.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...