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 最后设计了如下课程. 改良设计: 头文件 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,你试图有一个块用于处理自定义事件的代码,例如鼠标,键等. 在这种情况下,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处理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |