求助!模仿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