gpt4 book ai didi

C++ : Best practice when implementing Multiple inheritance

转载 作者:太空狗 更新时间:2023-10-29 20:10:58 26 4
gpt4 key购买 nike

我必须将两种类型的图形项(QGraphicsRectItemQGraphicsEllipseItem)的倍数添加到 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());
}

并且应用程序在这个修改后的设计中按预期工作。但是我对这个设计有些疑惑,如下:

  1. 这是处理这种情况的最佳做法,还是我应该采用初始方法?还是有其他最好的方法(编写单个代码来处理事件)?
  2. QGraphicsRectItemQGraphicsEllipseItem 都继承自QAbstractGraphicsShapeItem。那么我是否需要处理虚拟基类概念?

最佳答案

哇,想多了!

any other best method is there (to write single code to handle events)?

对我来说,问题并不清楚你试图实现什么,可能是由于尝试了解决方案,所以我将假设这两个类 QGraphicsRectItemQGraphicsEllipseItem,您正在尝试使用单个代码块来处理自定义事件,例如鼠标、按键等。

在这种情况下,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);

现在 pRectpEllipse 的所有事件都将由事件过滤器 pFilter 处理。

关于C++ : Best practice when implementing Multiple inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com