初步设计:
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 举报,一经查实,本站将立刻删除。