• 11624阅读
  • 6回复

graphicsview里面画圆,直线,圆弧,如何选定,撤销 [复制链接]

上一主题 下一主题
离线zfzgodfather
 
只看楼主 倒序阅读 楼主  发表于: 2009-11-04
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
如何实现选定,撤销等功能?是不是要把直线,圆,圆弧做成GraphicsSceneItem然后对他们进行操作,具体要怎样操作呢?
离线dbzhang800

只看该作者 1楼 发表于: 2009-11-04
你的画线什么的操作不都返回一个指针么?
离线zfzgodfather
只看该作者 2楼 发表于: 2009-11-04
引用第1楼dbzhang800于2009-11-04 22:21发表的  :
你的画线什么的操作不都返回一个指针么?

是呀!可以把它们都存起来,那要撤销之前的绘图操作,直接把line释放掉,场景里就不再显示了吗?还有鼠标点击选定这个如何达到呢?GraphicsSceneItem是干嘛用的?
离线zfzgodfather
只看该作者 3楼 发表于: 2009-11-04
可以加我qq吗?364064048
离线dbzhang800

只看该作者 4楼 发表于: 2009-11-04
demo中有不少QGraphicsView例子,你不妨看看吧
离线zfzgodfather
只看该作者 5楼 发表于: 2009-11-04
QGraphicsItem的paint函数的一些相关问题 收藏
在QGraphicsItem中,一个成员函数paint(),其声明如下:

void QGraphicsItem::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 )

在QGraphicsScene重绘绘制时,需要调用其中的每一个QGraphicsItem的paint()函数来逐个重新绘制组件。这个函数的参数 中,painter是绘图设备的painter,option定义了一些绘图参数,如绘图区域大小等,而widget则是绘图设备本身,paint()函 数实际上就是用painter在widget上画一个图,图形的具体内容则有paint()的具体实现确定。不同的QGrahpicsItem的子类对 paint()函数做了不同的实现,我们也可以按照自己的需要,实现自己的paint()函数(比如原来实现效率太低需要实现一个高效率的版本等等),比如我们可以考虑给paint函数里所在的类设置一个类成 员函数指针,在paint中调用这个成员函数指针来给程序增加一些灵活定等等。


有些情况下,我们通过paint重绘需要手动的调用QGraphicsScene的update()函数来刷新界面。当然,有时候刷新界面还会出些问题, 在update()调用之后不会跟着刷新(比如在Qt 4.2.2中)。这个时候我们需要修改一下boundingRect()函数,也就是继承QGrahpicsItem的boundingRect()函 数,返回一个区域。
离线zfzgodfather
只看该作者 6楼 发表于: 2009-11-04
Qt中QGraphicsItem/View/Scene的哲学 收藏
QGraphicsItem(http://doc.trolltech.com/4.2/qgraphicsitem.html)是一种图形化的显示元 素,通过QGraphicsTextItem、QGraphicsPixmapItem等等显示不同的类型的元素。但是继承自QGraphicsItem 的不同类型元素的定位等等,都是根据QGraphicsScene这样的顶层元素来定位的,QGraphicsItem只提供了最基本的元素的显示能力。 所以QGraphicsItemGroup被设计了出来,首先QGraphicsItemGroup本身也是继承自QGraphicsItem,所以让 QGraphicsItemGroup可以层次的包含自己,形成复杂的结构。而整合在一起的QGraphicsItemGroup可以综合在一起来定位自 己的子元素。

QGraphicsScene是QGraphicsItem画布,把众多的QGraphicsItem整合在一起。而QGraphView则是 QGraphicsScene显示层,即QGraphicsScene完成了“概念上”的显示元素的设计,而QGraphicsView则是一种窗口元 素,它完成了显示元素的显示。
快速回复
限100 字节
 
上一个 下一个