最近在用QGraphicsScene 和 QGraphicsView画图,遇到一个问题,请高手指教。
问题描述如下:
1。自定义两个QGraphicsItem: NodeItem(点) 和 EdgeItem(边)。(实现两点一线,点线能够拽动)
2。在QGraphicsScene中先画一个pixmap,pixmap的大小和QGraphicsView的大小一样,pixmap的颜色为gray
3。把QGraphicsScene添加到QGraphicsView中。
4。在QGraphicsView的mousePressEvent事件中,每次按下鼠标添加一个NodeItem到场景中,再根据相邻的两个点连成一条边。
5。问题出来了:当我每次按下鼠标后,NodeItem总能够显示在先前画的pixmap的上面,而EdgeItem有时显示在pixmap的后面,又因为 pixmap有背景色,所以EdgeItem有时会看不到。 不知有谁遇到过这种情况吗?我的Qt是4.4.3版本
Area::Area(QWidget *parent) : QGraphicsView(parent)
{
QPixmap pixmap(this->size());
pixmap.fill(Qt::gray); // 设成gray
QGraphicsScene *scene = new QGraphicsScene(this);
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
scene->setSceneRect(0, 0, width(), height());
setScene(scene);
setCacheMode(CacheBackground);
setViewportUpdateMode(BoundingRectViewportUpdate);
setRenderHint(QPainter::Antialiasing);
setTransformationAnchor(AnchorUnderMouse);
setResizeAnchor(AnchorViewCenter);
node = NULL;
scene->addPixmap(pixmap); //先把pixmap加进去
QToolButton *pl = new QToolButton(this);
pl->setText(tr("polygon"));
connect(pl,SIGNAL(clicked()),this,SLOT(polygonSlot()));
}
void Area::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton) {
QPointF p = mapToScene(event->pos());
if(node) {
NodeItem *dest = new NodeItem(p.x(),p.y(),3,3);
EdgeItem *edge = new EdgeItem(node,dest);
node = dest;
middlePointList << dest->midPoint();
nodeList << dest;
QPen pen(Qt::red);
edge->setPen(pen);
scene()->addItem(edge); // 添加后有时看不到边,出现在pixmap后面
} else {
node = new NodeItem;
node->setCenterPos(p.x(),p.y());
node->setWidth(3);
node->setHeight(3);
node->setMidPoint(p);
middlePointList << node->midPoint();
nodeList << node;
}
scene()->addItem(node); // 点正常,不会出现点在pixmap后面的情况
}
viewport()->update();
QGraphicsView::mousePressEvent(event);
}
[ 此帖被xlttap在2010-01-14 14:14重新编辑 ]