应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Qt开发GraphicsView编程

  一、QGraphicsScene
  1、QGraphicsScene
  QGraphicsScene继承自QObject,是一个管理图元的容器,与QGraphicsView合用可以在2D屏幕上显示如线、三角形、文本、自定义图元等图元。
  QGraphicsScene是不可见的,只用于管理图元。为了查看场景,需要创建一个视图组件。
  一个场景分为三个层:图元层、前景层和背景层。场景的绘制总是从背景层开始,然后是图形项层,最后是前景层。
  2、事件处理与传播
  QGraphicsScene的责任之一是传播来自视图的事件。要发送一个事件到场景,需要构造一个继承自QEvent的事件,使用QApplication::sendEvent()函数发送事件。event()函数负责派发事件到各个图元。常用的事件会被便利事件处理函数处理,如鼠标按下事件会被mousePressEvent()函数处理。
  按键事件会被派发到焦点图元。为了设置焦点图元,可以调用setFocusItem()函数,或是图元自身调用QGraphicsItem::setFocus()函数。调用focusItem()函数可以获取当前的焦点图元。为了兼容图形组件,场景维护着自己的焦点信息。默认场景并没有焦点,并且所有的按键事件会被丢弃。如果setFocus()函数被调用,或是场景中一个图元获得了焦点,场景会自动获得焦点。如果场景有焦点,hasFocus()函数会返回true,按键事件会被发送到焦点图元。如果场景失去了焦点,而图元有焦点(如调用clearFocus()函数),场景会维护图元的焦点信息,一旦场景重新获得焦点,会确保最后一个有焦点的图元获得焦点。
  对于悬停效果,QGraphicsScene会派发悬停事件,如果某个图元接受了悬停事件(调用QGraphicsItem::acceptHoverEvents()),当鼠标进入图元的区域时,图元会接收到一个GraphicsSceneHoverEnter事件。当鼠标继续在图元内部移动时,QGraphicsScene会发送GraphicsSceneHoverMove事件。当鼠标离开图元的区域时,图元会收到一个GraphicsSceneHoverLeave事件。
  所有鼠标事件会被传播到当前鼠标获取的图元。如果一个图元接收了鼠标事件,并收到鼠标按下,图元就是场景的鼠标获取图元。这个图元会一直被鼠标获取,直到图元收到一个鼠标释放事件。调用mouseGrabberItem()函数可以知道当前鼠标获取的图元。
  场景可以传递来自视图的事件,将事件传递给该点最顶层的图元。如果一个图元要接收键盘事件,那么它必须获得焦点。而且,如果在场景中重写了事件处理函数,那么在该函数的最后必须调用场景默认的事件处理函数,只有这样,图元才能接收到该事件。
  A、拖拽事件〔virtualprotected〕voiddragEnterEvent(QGraphicsSceneDragDropEventevent)
  拖入事件处理函数〔virtualprotected〕voiddragLeaveEvent(QGraphicsSceneDragDropEventevent)
  拖离事件梳理函数〔virtualprotected〕voiddragMoveEvent(QGraphicsSceneDragDropEventevent)
  拖动事件处理函数〔virtualprotected〕voiddropEvent(QGraphicsSceneDragDropEventevent)
  Drop事件处理函数
  在以上拖拽事件处理函数中的末尾需要调用QGraphicsScene类相应的事件处理函数。QGraphicsScene::dragEnterEvent(event);QGraphicsScene::dragLeaveEvent(event);QGraphicsScene::dragMoveEvent(event);QGraphicsScene::dropEvent(event);
  B、鼠标事件〔virtualprotected〕voidmouseMoveEvent(QGraphicsSceneMouseEventmouseEvent)
  鼠标移动处理函数〔virtualprotected〕voidmousePressEvent(QGraphicsSceneMouseEventmouseEvent)
  鼠标按下处理函数〔virtualprotected〕voidmouseReleaseEvent(QGraphicsSceneMouseEventmouseEvent)
  鼠标释放处理函数
  在以上鼠标事件处理函数中的末尾需要调用QGraphicsScene类相应的事件处理函数。QGraphicsScene::mouseMoveEvent(event);QGraphicsScene::mousePressEvent(event);QGraphicsScene::mouseReleaseEvent(event);
  3、索引算法
  索引算法,是指在场景中进行图元查找的算法。QGraphicsScene中提供了两种选择,在一个枚举变量QGraphicsScene::ItemIndexMethod中定义,分别是:
  QGraphicsSecne::BspTreeIndex:应用BinarySpacePartitiontree,适合于大量的静态图元,是默认值。
  QGraphicsScene::NoIndex:不用索引,搜索场景中所有的图元,适合于经常进行图元的添加、移动和删除等操作的情况。
  使用setItemIndexMethod()函数进行索引算法的更改。
  4、边界矩形
  图元可以放到场景的任何位置,场景的大小默认是没有限制的。而场景的边界矩形仅用于场景内部进行索引的维护。因为如果没有边界矩形,场景就要搜索所有的图元,然后确定出其边界,这是十分费时的。所以如果要操作一个较大的场景,应该给出它的边界矩形。
  设置边界矩形,可以使用setSceneRect()函数。
  5、图元的查找
  场景最大的优势之一就是可以快速的锁定图元的位置,即使有上百万个图元,items()函数也能在数毫秒的时间内锁定一个图元的位置。items()函数有几个重载函数来方便的进行图元的查找。如果在场景的一个点可能重叠着几个图元,可以使用itemAt()函数返回最上面的一个图元。
  二、QGraphicsItem
  1、自定义QGraphicsItem
  QGraphicsItem是图元的基类。
  自定义图元,首先应该继承QGraphicsItem,然后重写他的两个纯虚公共函数boundingRect()和paint(),boundingRect()函数返回绘制图元大概的区域,paint()函数用来绘制图元内容。
  boundingRect()函数有很多用处,场景在boundingRect()来建立它的图元的index,视图使用boundingRect来剪切可见的图元,在重新绘制图元时候,来决定相互重叠的部分,此外,图元的碰撞检测机制也使用的boundingRect()来提供一个高效的定点,在collidesWithItem()更好的碰撞算法建立在调用函数shape(),shape()函数以QpainterPath类型返回图元的精准的轮廓。
  场景不希望图元的boundingRect()和shape()变化,除非该图元被通告,如果想通过一些方法改变图元的形状,首先应该调用QgraphicsScene()来允许场景QgraphicsScene来刷新它的图元记录。
  图元没有获得焦点时,事件只能从视图传递到场景,不能传递到图元。清除图元的焦点函数为clearFocus()。
  2、绘制
  paint()函数被QgrapicsView类调用来绘制图元的内容,图元默认是没有背景或者填充颜色的。在函数中没有被绘制的所有区域都将会发亮,可以调用update()来重绘图元,可以选择传递需要重绘的矩形区域(不是必须的)。取决于图元在视图中是否可见,图元可能会也可能不会重绘,QgraphicsItem里面没有和Qwidget::repaint()函数等价的图元通过视图来绘制,从父类图元开始,然后是图元自身,以上升的栈的顺序,可以通过调用setZValue()设置图元的栈顺序,通过zValue()来测试,具有低zvalues的图元比具有高zvalue的图元先绘制,栈顺序应用于兄弟图元,父类图元总是比子类图元更早绘制。
  3、排序
  所有的图元都按照一个已经声明的稳定的顺序来绘制,声明的顺序决定了当在场景中点击鼠标时候,哪个图元最先接受鼠标的输入。通常情况下,不需要担心图元排序的问题,因为所有的图元都按照一个在场景中声明的自然的顺序。
  在一个栈中,子类图元在父类图元的上面,兄弟图元按照插入场景的顺序来入栈,如果你先添加图元A,然后是图元B,然后是图元C,栈中的顺序从下往上就是A、B、C。可以调用setZvalue()来设置一个图元的相对于另一个图元向上、向下或者兄弟栈顺序。默认的Z值是0,具有同样的Z值的图元会按照插入的顺序来入栈。可以调用stackBefore()来备份子类图元的列表,直接更正图元的顺序。
  如果想让子类图元在父类图元的后面,也就是先绘制子类图元,然后再绘制父类图元。可以利用函数setFlag()设置ItemStacksBehindParent属性给图元。
  4、事件处理
  QgraphicsItem从场景中通过sceneEvent()函数来接受事件,sceneEvent()函数通过一些方便的操作分散大部分事件。
  ContextMenuEvent()函数接受上下文菜单事件,
  FocusInEvent()和focusOutEvent()函数接受焦点进出事件,
  hoverEnterEvent()、hoverMoveEvent()、hoverLeaveEvent()接受鼠标悬浮移动和离开事件。
  inputMethodEvent()函数处理输入法事件,
  keyPressEvent()和keyReleaseEvent()事件处理键盘按下和释放事件
  mousePressEvent()、mouseMoveEvent()、mouseReleaseEvent()、mouseDoubleClickEvent()处理鼠标按下、移动、释放、双击事件
  通过安装过滤器,可以为图元过滤一些事件,与QT一般的事件过滤器不一样,一般的过滤器只工作在Qobject及其子类。通过调用installSceneEventFilter()为图元安装事件过滤器后,被过滤的事件将会被虚函数sceneEventFilter()捕捉到,可以通过调用函数removeSceneEventFilter()来去除掉事件过滤器。
  A、拖拽事件
  GraphicsView框架为视图、场景、图元提供拖拽支持。当视图接收到拖拽事件,GraphicsView框架会将拖拽事件翻译为QGraphicsSceneDragDropEvent事件,再发送到场景,场景接管事件,把事件发送到光标下接受拖拽的第一个图元。
  从图元开始拖拽时,创建一个QDrag对象,传递开始拖拽的QWidget的指针。图元可以同时被多个视图观察,但只有一个视图可以开始拖拽。拖拽在多数情况下是从按下鼠标或是移动鼠标开始的,在mousePressEvent()或mouseMoveEvent()中,可以从事件中得到原始的QWidget指针。
  要在场景中取拖拽事件,需要重新实现QGraphicsScene::dragEnterEvent()和QGraphicsItem子类里任何与特定场景需要的事件处理器。图元也可以通过调用QGraphicsItem::setAcceptDrops()获得拖拽支持,为了处理将要进行的拖拽,需要重新实现QGraphicsItem的dragEnterEvent()、dragMoveEvent()、dropEvent()、dragLeaveEvent()。〔virtualprotected〕voiddragEnterEvent(QGraphicsSceneDragDropEventevent)〔virtualprotected〕voiddragLeaveEvent(QGraphicsSceneDragDropEventevent)〔virtualprotected〕voiddragMoveEvent(QGraphicsSceneDragDropEventevent)
  〔virtualprotected〕voiddropEvent(QGraphicsSceneDragDropEventevent)
  B、鼠标事件
  要在自定义图元类中处理鼠标事件,需要重写QGraphicsItem类中鼠标按下、鼠标移动、鼠标释放的事件。〔virtualprotected〕voidmouseMoveEvent(QGraphicsSceneMouseEventevent)〔virtualprotected〕voidmousePressEvent(QGraphicsSceneMouseEventevent)〔virtualprotected〕voidmouseReleaseEvent(QGraphicsSceneMouseEventevent)
  5、动画效果
  实现图元的动画效果,也可以在不同的层面进行。如果只想控制一两个图元的动画,一般在场景或视图中实现。但是要是想让一个图元类的多个对象都进行同样的动画,那么我们就可以在图元类的构造函数中进行实现。
  图元可获得焦点setFlag(QGraphicsItem::ItemIsFocusable);
  图元可移动setFlag(QGraphicsItem::ItemIsMovable);QGraphicsItemAnimationanimnewQGraphicsItemAnimation;
  将图元加入动画对象中animsetItem(this);
  创建长为1秒的时间线QTimeLinetimeLinenewQTimeLine(1000);
  动画循环次数为0,表示无限循环timeLinesetLoopCount(0);
  将时间线加入动画类对象中animsetTimeLine(timeLine);
  在动画时间的一半时图形项旋转180度animsetRotationAt(0。5,180);
  在动画执行完时图形项旋转360度animsetRotationAt(1,360);
  开始动画timeLinestart();
  6、移动
  图元的移动,有多种方法实现,可以在视图或场景上控制,但对于不同类型的大量图元,怎样能一起控制呢?在图形视图框架中提供了advance()槽函数,advance()函数在QGraphicsScene和QGraphicsItem中都有定义,在图元类中的原型是advance(intphase)。实现流程是,利用QGraphicsScene类的对象调用QGraphicsScene的advance()函数,会执行两次场景中所有图元的advance(intphase)函数,第一次phase为0,告诉所有图形项即将要移动;第二次phase的值为1,执行移动。QTimertimer;QObject::connect(timer,SIGNAL(timeout()),scene,SLOT(advance()));timer。start(1000);
  至于图元如何移动,需要重写图元类的advance()函数。
  如果在自定义图元类的构造函数中设置为可移动,则图元可以直接使用鼠标拖拽。setFlag(QGraphicsItem::ItemIsMovable);
  7、图元的坐标转换
  QgraphicsItem支持坐标转换,对于简单的转换,可以调用函数setRotation()或者setScale(),可以传递一个转换矩阵给函数setTransform(),对于一些更复杂的转换,可以通过调用函数setTransformations()来设置一系列组合的转换。
  图元转换从父类到子类进行聚集,因此如果一个父类图元和子类图元都旋转90度,那么子类图元就旋转了180度;如果父类图元和子类图元都放大了2X倍,那么子类图元就被放大4X倍,图元的转换不影响图元的外观,所有和外观有关的函数(例如contains(),update()和所有的映射mapping函数)将会在本地坐标中操作,QgraphicsItem提供函数sceneTransform(),将会返回图元所有的转换矩阵,scenePos()将会返回图元在场景坐标中的位置,重新设置图元的矩阵,调用函数resetTransform()。
  一般的转换回产生一个不同的结果,取决于转换应用的顺序,转换顺序不同得到结果将不同。
  8、主要成员函数QVariantitemChange(GraphicsItemChangechange,constQVariantvalue)
  itemChange函数被QGraphicsItem调用用来标识图元的状态改变了,通过重载itemChange函数,可以对自己定义事件响应。参数change是改变的图元的改变状态参数,value是一个新的数据,类型取决于change,change是QGraphicsItem::GraphicsItemChange枚举变量。
  在itemChange函数内部调用函数时候要谨慎,不能在itemChange函数里面调用setPos(),参数change是ItemPositionChange时,setPos()函数将会再次调用itemChange(ItemPositionChange),形成死循环。voidsetFlag(GraphicsItemFlagflag,boolenabledtrue)voidsetFlags(GraphicsItemFlagsflags)
  flags设置为图元的属性,如果图元获得了光标,但flags没有使能ItemsFocusable,图元将会丢失光标,当图元被选择,但没有使能ItemsSelectable,图元会自动的失去选择。QPainterPathshape()const
  以QPainterPath返回图元在本地坐标中的形状,形状可以用来做很多事情,包括碰撞侦测,打击测试,还有用来QGraphicsScene::items()函数
  默认的函数调用boundingRect()返回一个简单的矩形形状,子类可以重载boundingRect函数,为非矩形的图元返回一个更加精准的形状,例如一个圆形的图元可以选择返回一个椭圆形,用来获得更好的碰撞侦测效果。
  三、QGraphicsView
  1、QGraphicsView简介
  QGraphicsView继承自QAbstractScrollArea,继承了QWidget的特性。
  QGraphicsView提供了视图窗口部件,使场景的内容可视化。可以给一个场景关联多个视图,从而给一个数据集提供多个视口。视图部件是一个滚动区域,可以提供一个滚动条来显示大型的场景。
  2、事件处理
  在图形视图框架中,鼠标键盘等事件是从视图进入的,视图将事件传递给场景,场景再将事件传递给该点的图元,如果该点有多个图元,那么就传给最上面的图元。为了使事件能进一步传播到场景,需要在重新实现事件处理函数时,在其最后将event参数传给默认的事件处理函数。比如重写了视图的鼠标按下事件处理函数,那么就在该函数的最后写上QGraphicsView::mousePressEvent(event);
  A、拖拽事件
  在QGraphicView中提供了三种拖拽模式,分别是:
  QGraphicsView::NoDrag:忽略鼠标事件,不可以拖动。
  QGraphicsView::ScrollHandDrag:光标变为手型,可以拖动场景进行移动。
  QGraphicsView::RubberBandDrag:使用橡皮筋效果,进行区域选择,可以选中一个区域内的所有图元。
  可以利用setDragMode()函数进行相应设置。〔virtualprotected〕voiddragEnterEvent(QDragEnterEventevent)〔virtualprotected〕voiddragLeaveEvent(QDragLeaveEventevent)〔virtualprotected〕voiddragMoveEvent(QDragMoveEventevent)〔virtualprotected〕voiddropEvent(QDropEventevent)
  在以上拖拽事件处理函数中的末尾需要调用QGraphicsView类相应的事件处理函数。QGraphicsView::dragEnterEvent(event);QGraphicsView::dragLeaveEvent(event);QGraphicsView::dragMoveEvent(event);QGraphicsView::dropEvent(event);
  B、鼠标事件〔virtualprotected〕voidmouseMoveEvent(QMouseEventevent)〔virtualprotected〕voidmousePressEvent(QMouseEventevent)〔virtualprotected〕voidmouseReleaseEvent(QMouseEventevent)voidsetMouseTracking(boolenable)
  在以上鼠标事件处理函数中的末尾需要调用QGraphicsView类相应的事件处理函数。QGraphicsView::mouseMoveEvent(event);QGraphicsView::mousePressEvent(event);QGraphicsView::mouseReleaseEvent(event);
  四、程序实例
  1、自定义视图
  CustomView。h文件:ifndefCUSTOMVIEWHdefineCUSTOMVIEWHincludeQGraphicsViewclassCustomView:publicQGraphicsView{QOBJECTpublic:CustomView(QWidgetparent0);protected:voidmousePressEvent(QMouseEventevent)QDECLOVERRIDE;voidmouseMoveEvent(QMouseEventevent)QDECLOVERRIDE;voidmouseReleaseEvent(QMouseEventevent)QDECLOVERRIDE;voidpaintEvent(QPaintEventevent)QDECLOVERRIDE;voiddragEnterEvent(QDragEnterEventevent)QDECLOVERRIDE;voiddragLeaveEvent(QDragLeaveEventevent)QDECLOVERRIDE;voiddragMoveEvent(QDragMoveEventevent)QDECLOVERRIDE;voiddropEvent(QDropEventevent)QDECLOVERRIDE;};endifCUSTOMVIEWH
  CustomView。cpp文件:includeCustomView。hincludeQDebugCustomView::CustomView(QWidgetparent):QGraphicsView(parent){}voidCustomView::mousePressEvent(QMouseEventevent){qDebug()CustomView::mousePressEvent;QGraphicsView::mousePressEvent(event);}voidCustomView::mouseMoveEvent(QMouseEventevent){qDebug()CustomView::mouseMoveEvent;QGraphicsView::mouseMoveEvent(event);}voidCustomView::mouseReleaseEvent(QMouseEventevent){qDebug()CustomView::mouseReleaseEvent;QGraphicsView::mouseReleaseEvent(event);}voidCustomView::paintEvent(QPaintEventevent){qDebug()CustomView::paintEvent;QGraphicsView::paintEvent(event);}voidCustomView::dragEnterEvent(QDragEnterEventevent){qDebug()CustomView::dragEnterEvent;QGraphicsView::dragEnterEvent(event);}voidCustomView::dragLeaveEvent(QDragLeaveEventevent){qDebug()CustomView::dragLeaveEvent;QGraphicsView::dragLeaveEvent(event);}voidCustomView::dragMoveEvent(QDragMoveEventevent){setCursor(Qt::CrossCursor);qDebug()CustomView::dragMoveEvent;QGraphicsView::dragMoveEvent(event);}voidCustomView::dropEvent(QDropEventevent){qDebug()CustomView::dropEvent;QGraphicsView::dropEvent(event);}
  2、自定义场景
  CustomScene。h文件:ifndefCUSTOMSCENEHdefineCUSTOMSCENEHincludeQGraphicsSceneincludeQGraphicsSceneMouseEventincludeQPaintEventclassCustomScene:publicQGraphicsScene{QOBJECTpublic:CustomScene(QObjectparent0);protected:voidmousePressEvent(QGraphicsSceneMouseEventevent)QDECLOVERRIDE;voidmouseReleaseEvent(QGraphicsSceneMouseEventevent)QDECLOVERRIDE;voidmouseMoveEvent(QGraphicsSceneMouseEventevent)QDECLOVERRIDE;voiddragEnterEvent(QGraphicsSceneDragDropEventevent)QDECLOVERRIDE;voiddragLeaveEvent(QGraphicsSceneDragDropEventevent)QDECLOVERRIDE;voiddragMoveEvent(QGraphicsSceneDragDropEventevent)QDECLOVERRIDE;voiddropEvent(QGraphicsSceneDragDropEventevent)QDECLOVERRIDE;};endifCUSTOMSCENEH
  点击领取Qt学习资料视频教程链接
  CustomScene。cpp文件:includeCustomScene。hincludeQDebugCustomScene::CustomScene(QObjectparent):QGraphicsScene(parent){}voidCustomScene::mousePressEvent(QGraphicsSceneMouseEventevent){qDebug()CustomScene::mousePressEvent;QGraphicsScene::mousePressEvent(event);}voidCustomScene::mouseReleaseEvent(QGraphicsSceneMouseEventevent){qDebug()CustomScene::mouseReleaseEvent;QGraphicsScene::mouseReleaseEvent(event);}voidCustomScene::mouseMoveEvent(QGraphicsSceneMouseEventevent){qDebug()CustomScene::mouseMoveEvent;QGraphicsScene::mouseMoveEvent(event);}voidCustomScene::dragEnterEvent(QGraphicsSceneDragDropEventevent){qDebug()CustomScene::dragEnterEvent;QGraphicsScene::dragEnterEvent(event);}voidCustomScene::dragLeaveEvent(QGraphicsSceneDragDropEventevent){qDebug()CustomScene::dragLeaveEvent;QGraphicsScene::dragLeaveEvent(event);}voidCustomScene::dragMoveEvent(QGraphicsSceneDragDropEventevent){qDebug()CustomScene::dragMoveEvent;QGraphicsScene::dragMoveEvent(event);}voidCustomScene::dropEvent(QGraphicsSceneDragDropEventevent){qDebug()CustomScene::dropEvent;QGraphicsScene::dropEvent(event);}
  3、自定义图元
  CustomItem。h文件:ifndefCUSTOMITEMHdefineCUSTOMITEMHincludeQGraphicsItemincludeQGraphicsSceneMouseEventclassCustomItem:publicQGraphicsItem{public:CustomItem();voidpaint(QPainterpainter,constQStyleOptionGraphicsItemoption,QWidgetwidget)QDECLOVERRIDE;QRectFboundingRect()constQDECLOVERRIDE;protected:鼠标事件voidmousePressEvent(QGraphicsSceneMouseEventevent)QDECLOVERRIDE;voidmouseMoveEvent(QGraphicsSceneMouseEventevent)QDECLOVERRIDE;voidmouseReleaseEvent(QGraphicsSceneMouseEventevent)QDECLOVERRIDE;拖拽事件voiddragEnterEvent(QGraphicsSceneDragDropEventevent)QDECLOVERRIDE;voiddragLeaveEvent(QGraphicsSceneDragDropEventevent)QDECLOVERRIDE;voiddragMoveEvent(QGraphicsSceneDragDropEventevent)QDECLOVERRIDE;voiddropEvent(QGraphicsSceneDragDropEventevent)QDECLOVERRIDE;private:QColorcolor;};endifCUSTOMITEMH
  点击领取Qt学习资料视频教程链接
  CustomItem。cpp文件:includeCustomItem。hincludeQDebugincludeQPainterincludeQCursorincludeQPenCustomItem::CustomItem(){colorQt::red;setFlag(QGraphicsItem::ItemIsFocusable);设置图元为可移动的setFlag(QGraphicsItem::ItemIsMovable);setAcceptDrops(true);}voidCustomItem::paint(QPainterpainter,constQStyleOptionGraphicsItemoption,QWidgetwidget){QUNUSED(option);QUNUSED(widget);qDebug()CustomItem::paint;if(hasFocus()){paintersetPen(QPen(QColor(255,255,255,200)));}else{paintersetPen(QPen(QColor(100,100,100,100)));}paintersetBrush(color);painterdrawRect(10,10,20,20);}QRectFCustomItem::boundingRect()const{qrealadjust0。5;returnQRectF(10adjust,10adjust,20adjust,20adjust);}voidCustomItem::mousePressEvent(QGraphicsSceneMouseEventevent){QUNUSED(event);qDebug()CustomItem::mousePressEvent;setCursor(Qt::OpenHandCursor);}voidCustomItem::mouseMoveEvent(QGraphicsSceneMouseEventevent){setCursor(Qt::DragMoveCursor);qDebug()CustomItem::mouseMoveEvent;}voidCustomItem::mouseReleaseEvent(QGraphicsSceneMouseEventevent){qDebug()CustomItem::mouseReleaseEvent;setCursor(Qt::ArrowCursor);}voidCustomItem::dragEnterEvent(QGraphicsSceneDragDropEventevent){setCursor(Qt::CrossCursor);qDebug()CustomItem::dragEnterEvent;}voidCustomItem::dragLeaveEvent(QGraphicsSceneDragDropEventevent){setCursor(Qt::ForbiddenCursor);qDebug()CustomItem::dragLeaveEvent;}voidCustomItem::dragMoveEvent(QGraphicsSceneDragDropEventevent){setCursor(Qt::CrossCursor);qDebug()CustomItem::dragMoveEvent;}voidCustomItem::dropEvent(QGraphicsSceneDragDropEventevent){setCursor(Qt::WaitCursor);qDebug()CustomItem::dropEvent;}
  4、程序使用
  登录后复制includeCustomScene。hincludeCustomView。hincludeCustomItem。hincludeQApplicationincludeQTimeintmain(intargc,charargv〔〕){QApplicationa(argc,argv);qsrand(QTime(0,0,0)。secsTo(QTime::currentTime()));CustomScenescene;scene。setSceneRect(200,150,400,300);for(inti0;i5;i){CustomItemitemnewCustomItem;itemsetPos(i5090,50);scene。addItem(item);}CustomViewview;view。setScene(scene);view。show();returna。exec();}

荣耀亲选脊安适颈部按摩器推出15天超长续航售179元8月10日,荣耀亲选脊安适颈部按摩器正式开售,首销价为179元。目前,消费者已经可以在荣耀商城进行选购。脊安适颈部按摩器据CNMO了解,该产品采用3头专利设计。3角……女士49岁,提眉手术,术前术后变化大,眼睛看着年轻了10岁女士今年49岁,也是我的前同事,过来找我是准备做眼周年轻化手术,主要提了以下几个要求:筋膜悬吊提眉手术术前1、要让双眼皮重新恢复到年轻时的宽度2、去掉上眼睑的……鲍里斯辞职后穿得好随意!抱2岁儿子高调出街,爷俩卷毛发型吸睛鲍里斯前段时间,刚发表了辞职演讲,脱下重担后的他,开始享受起了悠闲的家庭生活,当地时间周五,网上就曝光了一张鲍里斯抱着两岁儿子出街的路透照,父子俩同框的画面,顿时引来了无数热议……一周运动新品北面新品重回山野,lululemon发布全新HiTHENORTHFACE行装入野系列新品近日,著名户外运动品牌THENORTHFACE发布了行装入野系列新品,包含背包和帐篷两大单品。背包共HOTSHOTSE、BO……王石称不会把谷爱凌作为孩子的培养目标,能做个普通人就好冬奥会结束之后,谷爱凌作为奥运冠军备受关注,令人羡慕的是,她不仅体育好,又是一名妥妥的学霸,在时尚界也有一席之地。如此多重身份加持,让这个青春靓丽的小姑娘活出了大家都想活成的模……Sonya7RV亮相尘埃落定?3款新机2022年秋季正式亮相2022年,随着佳能、松下、富士等品牌相机类新品的陆续发布,作为业界顶流的索尼将带来怎样的惊喜令无数索粉翘首以盼。据外网信息,今年秋季将有一批索尼新品将与索粉见面,其中包括一台……贾跃亭又造假,250亿灰飞烟灭贾跃亭在美国,又曝出了大新闻。来源大江湖解局来源pixabay2月2日,法拉第未来的独立董事会,在自查报告中,自曝法拉第未来收到的1。4万个订单中,只有几百个……在银行存100万,是存在一家银行好,还是存在多家银行好?很多人都有多个银行的储蓄账户,因此在把钱存到银行时,就可以有多种选择,既可以存在一家银行里,也可以存在多家银行里。那么,如果要把100万存银行,是存一家银行好还是多家银行好呢?……施罗德有望重回湖人?詹姆斯态度耐人寻味,二人有望再次联手休赛期的洛杉矶好不热闹,湖人队谜之操作令球迷无语,手持威少二轮签企图换遍全联盟,本以为湖人队准备了什么大动作,结果最终竹篮打水一场空。最近又有消息曝出,湖人正在考虑签回施罗德,……白鹿奔跑吧兄弟穿冰丝睡衣,优雅温柔,随性又自然点击上方蓝字关注我们睡衣这种居家服饰,很容易将女性的温婉与优雅呈现出来,近些年睡衣融入时尚元素后,可以作为时尚单品走上街头也不会出现违和感。新一期的《奔跑吧兄弟》女星白鹿……多地断供!强制停贷愈演愈烈?中国房地产能否挺住?预售制取消?这一次的中国房地产行业,又出现了危机,那就是多地爆发的断供潮。而8年前的那次地产危机不同,此次断供具有一定的群体性,往往是整个小区整个小区的宣布断供所导致的。而且出现的地……反人类的研究!美国科学家研制新病毒,死亡率高达80头条创作挑战赛新冠疫情三年了,还没有平息。竟然又研制新的,传染性极强的,致命病毒,可恶至极!最近几天一则所谓的科研消息被全球关注:根据美国《每日邮报》报道,美国的波……
如果今夜,雪能睡醒多好郝有花那些柔弱的尚未僵死的树叶在风里飞舞,可爱的像一个个舞者他们的痛,只有风知道如果今夜,雪能睡醒多好可以给夜一个白色的枕头寒风拥抱着月光,……IPO观察丨中旭未来拟赴港上市,曾分红1亿却欠缴员工近5千万红星资本局12月1日消息,近日港交所官网披露,中旭未来向港交所主板提交了上市申请,联席保荐人分别为中金公司和中信建投国际。据悉,中旭未来的前身为贪玩游戏,2022年1月,……蔬菜生吃更有营养?真的不一定很多人喜欢生吃蔬菜,觉得这样更有营养,因为蔬菜中的维生素C和活性成分等营养物质不会因为加热而损失。比如洋葱,含有一种叫做杀菌素的活性成分,具有杀菌抑菌、刺激食欲、帮助消化……多囊闭经怎么办对于青春期的多囊卵巢综合征患者,应辨证论治,力求使患者月经如期来潮,保护其卵巢功能,以期到育龄期后能顺利生育;对于育龄期有生育要求的患者,尽量增加卵巢敏感性,促使卵巢内卵……全球五大连锁酒店酒店业不仅是世界上最大的行业之一,也是推动对许多国家经济至关重要的旅游业的最重要行业之一。然而,没有其他行业比酒店业更能感受到Covid19大流行的影响。据NPR报道,2020……小米小爱语音6。1。2版本发布,支持语音控制NFC状态IT之家12月27日消息,小米小爱语音现已发布6。1。2。2715版本,多项功能迎来更新。在新版本中,小爱语音新增语音创建日程,并可通过小爱建议桌面小部件主动提醒。……心理医生,世界杯第27名球员记者寒冰报道卡塔尔世界杯刚刚落幕,500万阿根廷人在布宜诺斯艾利斯为梅西和他的英雄团队疯狂。梅西毫无疑问是绝对的主角,但屡次扑出点球的门将马丁内斯是当仁不让的男二号。谁又能想到……图片格式怎么转换成jpg?教你一招!怎么把图片转成jpg格式呢?有这种问题的一般是需要上传电子照的小伙伴们,一些网站对上传的图片有很明确的要求。比如你的图片格式为PNG,而网站要求的是JPG或JPEG,那就不在其……2022年各大品牌值得入手的机型有哪些?年底换机可参考这份清文名动科技时间即将来到年底,你准备好换新机了吗?如果说有换机打算,但市面上的产品让你看得眼花缭乱,不知道怎么选的话,那么本期的2022年各大品牌值得入手的机型盘点就别错过……翡冷翠名门美第奇与文艺复兴(四)凯瑟琳德美第奇:法国王后(1519年1589年)美第奇家族杰出代表人物之三:凯瑟琳德美第奇(1519年1589年),她是法国国王亨利二世的妻子,她不仅是一位法国王后,而且……解锁元宇宙实景化光影世界,广州国际灯光节正式亮灯12月27日晚,2022年第十一届广州国际灯光节在线上云看灯光节正式亮灯,北京路商圈、一江两岸的灯光作品也一同亮起,南沙区分会场亦同步亮相,为期13天的灯光节以一种别致的精彩与……给宝贝的第61封信呵护梦想,才有远方摘要:没有梦想的人生,将黯淡无光;没有梦想的国家,将固步自封;没有梦想的社会,将徘徊不前越发达的社会,越先进的团队,越前瞻的思维,越懂得尊重和呵护梦想的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网