• 16123阅读
  • 6回复

关于一个QGraphicsScene的addItem()的问题 [复制链接]

上一主题 下一主题
离线xlttap
 

只看楼主 倒序阅读 楼主  发表于: 2010-01-14
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
最近在用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重新编辑 ]
我简单我快乐
离线dbzhang800

只看该作者 1楼 发表于: 2010-01-14
void QGraphicsItem::setZValue ( qreal z )
离线xlttap

只看该作者 2楼 发表于: 2010-01-14
这里是问题截图,在附件中
我简单我快乐
离线xlttap

只看该作者 3楼 发表于: 2010-01-14
引用第1楼dbzhang800于2010-01-14 14:17发表的  :
void QGraphicsItem::setZValue ( qreal z )


请问setZValue中的ZValue是什么意思啊?我到现在也不明白它的含义。
我在Item的构造方法中写了,但不知道是有什么用。
NodeItem::NodeItem(QGraphicsItem * parent) : QGraphicsItem(parent)
{
    setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
    setCacheMode(DeviceCoordinateCache);
    setZValue(1);
    setAcceptedMouseButtons(Qt::MidButton);
}

EdgeItem::EdgeItem(NodeItem *sNode,NodeItem *dNode)
{
    setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
    setAcceptedMouseButtons(Qt::RightButton);
    setZValue(1);
    source = sNode;
    dest = dNode;
    source->addEdge(this);
    dest->addEdge(this);
    adjust();
}
我简单我快乐
离线xlttap

只看该作者 4楼 发表于: 2010-01-14
谢谢一楼的,根据你说的,我现在解决了。您能详细说一下setZValue的用处是什么吗?
我简单我快乐
离线babybluema

只看该作者 5楼 发表于: 2010-03-03
setZValue是设置item的层叠顺序的。zValue值大的item在zValue值小的item之上。如果不设置默认为为0,item的层叠会按照加入的顺序层叠。
离线tlcugb

只看该作者 6楼 发表于: 2011-05-05
哥们,请问一下,你的等值线图是怎么实现的?放大后有没有马赛克现象!?
快速回复
限100 字节
 
上一个 下一个