微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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处理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐