【发布时间】:2016-02-23 11:35:34
【问题描述】:
我必须将两种图形项(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。那么我需要处理虚拟基类的概念吗?
【问题讨论】:
-
我认为这应该在 [CR](codereview.stackexchange.com) 上。请注意,交叉发布不被视为“良好行为”。
-
你可以简单的让myQGraphicsRectItem从T单独继承,从而去掉多重继承。
-
@Jonathan,试试你所说的概念......
-
请记住,此代码工作正常,因为
*GraphicsItem没有一个继承QObject。来自QObject的多重继承不起作用。 -
@Jonathan。它工作正常。我对这种方法很满意。
标签: c++ qt templates multiple-inheritance virtual-inheritance