我将要添加两种图形项(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
。那么我需要处理虚拟基类概念吗?
*GraphicsItem
继承自QObject
,因此此代码可以正常工作。从QObject
进行多重继承是不起作用的。 - iksemyonov