从QGraphicsItem + QWidget

时间:2018-03-23 12:23:12

标签: c++ qt qwidget qgraphicsitem

我正在编写一个继承自QGraphicsItem和QWidget的类。我这样做的原因是因为我想利用setPos()和setRotation()(来自QGraphicsItem)使其可拖动和customContextMenuRequested信号(来自QWidget)。代码如下所示:

class MyClass: public QWidget, public QGraphicsItem {    
  Q_OBJECT 
/* Variables and Methods here */ 
};

我不是QT的专家,也不是每个细节的工作原理。然而,通过测试代码,我感觉MyClass实际上由两个可能具有不同位置的GUI元素组成。问题是,当我把它们放在彼此的顶部时,我要么无法使上下文菜单工作,要么我无法拖动它。所以我假设顶部只能有一个(接收鼠标点击事件)。 MyClass是QGraphicsScene作为QGraphicsItem,QGraphicsScene设置为QGraphicsView,如果这是相关的。

我的假设是否正确?

处理此问题的优雅方法是什么?

提前致谢!

编辑:如果它有帮助,那么我的申请基本上应该做什么。 用户应该能够向场景添加多个MyClass对象和类似对象,并自由地移动/旋转它们。

1 个答案:

答案 0 :(得分:3)

在Qt中,

QWidgetQGraphicsItem根本不同。从文档中QGraphicsItem是:

  

QGraphicsItem类是QGraphicsScene中所有图形项的基类。

     

它为编写您自己的自定义项目提供了轻量级的基础。这包括通过事件处理程序定义项目的几何,碰撞检测,绘图实现和项目交互。 QGraphicsItem是Graphics View Framework的一部分

基本上它仅用于QGraphcisScene

如果您需要QWidget提供的自定义上下文菜单,我会在自定义QGraphicsView中实现此功能,该自定义QWidget(最终)从QGraphicsView继承。 QGraphicsScene可用于显示QGraphicsItem,其中包含您的自定义//Add this lines and try again QRadioButton *obj = new QRadioButton() obj->setObjectName("test"); //If your using qss/css file for styling things... #test QRadioButton::indicator { width: 25px; height: 25px; }