当前位置:编程学习 > wap >>

求助!模仿Diagramscene遇到问题

求助各位大神
  最近用QGraphicsView,QGraphicsScene,QGraphicsItem三个类做类似电子地图的小程序,想实现在GraphicsView里左键单击item,按住鼠标移动到另一item,如果两个item分别是某一种特定的类型就在两者间画出一条带箭头的线,模仿的是demo里的Diagramscene,不同是item分别用QGraphicsItem派生出两个子类MReservioritem 和 MUseritem ,子类的type不一样,Diagramscene里用的是QGraphicsPolygonItem做派生,scene和Diagramscene的scene类似,但是去掉了Mode等几个成员,MousePressEvent,MouseMoveEvent,MouseReleaseEvent做了小修改,代码分别如下

void MGraphicsscene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if (mouseEvent->button() == Qt::LeftButton )
{
QList<QGraphicsItem *> startItems = items(mouseEvent->scenePos());
        if (startItems.count() >0 && startItems.first()->type() == MReservioritem::Type)
{
line = new QGraphicsLineItem(QLineF(mouseEvent->scenePos(),mouseEvent->scenePos()));                         
line->setPen(QPen(myLineColor, 2));
addItem(line);
}
}
else if(mouseEvent->button() == Qt::RightButton)
{
  QGraphicsScene::mousePressEvent(mouseEvent);
}
}



void MGraphicsscene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    if (line != 0) 
{
        QLineF newLine(line->line().p1(), mouseEvent->scenePos());
        line->setLine(newLine);
    }
}



void MGraphicsscene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
 if (line != 0 ) 
 {
        QList<QGraphicsItem *> startItems = items(line->line().p1());
        if (startItems.count() && startItems.first() == line)
{
            startItems.removeFirst();
}
        QList<QGraphicsItem *> endItems = items(line->line().p2());
        if (endItems.count() && endItems.first() == line)
{
            endItems.removeFirst();
}
        removeItem(line);
        delete line;

        if (startItems.count() > 0 && endItems.count() > 0 &&
            startItems.first()->type() == MReservioritem::Type &&
            endItems.first()->type() == MUseritem::Type && 
startItems.first()!=endItems.first())
{
            MReservioritem *startItem = qgraphicsitem_cast<MReservioritem *>(startItems.first());                
            MUseritem *endItem = qgraphicsitem_cast<MUseritem *>(endItems.first());
            MNewlink *arrow = new MNewlink(startItem, endItem);
            startItem->addArrow(arrow);
            endItem->addArrow(arrow);
            arrow->setZValue(-1000.0);
            addItem(arrow);//就是这一步有问题,执行这一步的时候报错
            arrow->updatePosition();
        }
    }
    line = 0;
    QGraphicsScene::mouseReleaseEvent(mouseEvent);
}


其中MNewlink 类与Diagramscene里的arrow类基本一样,只是把startItem和endItem分别换成MReservioritem和MUseritem 。
   每次执行,左键单击画线没问题,可是release就出问题,有时候是在addItem(arrow)溢出,有时候又是画出的箭头不对,画出的东西很奇怪。
连线前:

连线后:

而且不管连接哪两个item都是这个结果,代码里画出的箭头应该是等边三角形,这里不知道是什么问题
求各位大神帮帮忙! GraphicsScene 鼠标事件 DiagramScene 箭头连线 qt --------------------编程问答-------------------- 你调试运行 单步跟一下看看错在哪里
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,