Qt - 拖动移动 qgraphicsitem 效果不佳
Qt - drag move qgraphicitem don't work nice
我基于 Qt 标准示例的简单代码 'diagram scene'。 MainWindow 最简单,只加载自定义场景。 UI 是在图形编辑器中制作的。
使用鼠标右键拖动和移动图形多边形工作,左键创建新项目。所以?
我必须双击 select 的项目。当我想要移动项目时,项目需要双击而不释放最后一次单击。满头晕。
商品代码:
BasicDiagramItem::BasicDiagramItem(QGraphicsItem *parent):
QGraphicsPolygonItem(parent)
{
drawCustomPoly();
}
void BasicDiagramItem::drawCustomPoly()
{
QPainterPath path;
customPoly << QPointF(0,50) << QPointF(50,0)
<< QPointF(0,-50) << QPointF(-50,0)
<< QPointF(0,50);
setPolygon(customPoly);
setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsSelectable, true);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
//setFlag(QGraphicsItem::ItemClipsToShape,true); //testowe
}
void BasicDiagramItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsPolygonItem::mouseMoveEvent(event);
}
场景代码:
DiagramScene::DiagramScene(QObject *parent):
QGraphicsScene(parent)
{
}
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton) return;
BasicDiagramItem *item;
item = new BasicDiagramItem();
//item->setBrush()
addItem(item);
item->setPos(mouseEvent->scenePos());
QGraphicsScene::mousePressEvent(mouseEvent);
}
void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
QGraphicsScene::mouseMoveEvent(mouseEvent);
}
void DiagramScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
QGraphicsScene::mouseReleaseEvent(mouseEvent);
}
此代码与Qt示例相似。我只是不使用模式创建不同的对象,不使用自定义菜单,我不画箭头。
所以,我做错了什么?为什么应用程序有双击错误?
So, what i do wrong? Why apps have a bug with double-click?
我觉得是这个原因:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton) return;
请注意,在 single-left-click 上,mousePressEvent() 只是 returns 没有做任何事情;这可以解释为什么当你 single-left-click 时什么也没有发生。 (在 double-click、OTOH 上,改为调用 mouseDoubleClickEvent(),并且由于您没有覆盖 mouseDoubleClickEvent(),因此调用 QGraphicsScene::mouseDoubleClickEvent() 方法并处理那里的点击。
我想你想做的是:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton)
{
QGraphicsScene::mousePressEvent(mouseEvent); // call up to superclass
return;
}
[...]
这样,QGraphicsScene::mousePressEvent(mouseEvent) 可以完成选择用户单击的项目的工作。
我基于 Qt 标准示例的简单代码 'diagram scene'。 MainWindow 最简单,只加载自定义场景。 UI 是在图形编辑器中制作的。 使用鼠标右键拖动和移动图形多边形工作,左键创建新项目。所以? 我必须双击 select 的项目。当我想要移动项目时,项目需要双击而不释放最后一次单击。满头晕。
商品代码:
BasicDiagramItem::BasicDiagramItem(QGraphicsItem *parent):
QGraphicsPolygonItem(parent)
{
drawCustomPoly();
}
void BasicDiagramItem::drawCustomPoly()
{
QPainterPath path;
customPoly << QPointF(0,50) << QPointF(50,0)
<< QPointF(0,-50) << QPointF(-50,0)
<< QPointF(0,50);
setPolygon(customPoly);
setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsSelectable, true);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
//setFlag(QGraphicsItem::ItemClipsToShape,true); //testowe
}
void BasicDiagramItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsPolygonItem::mouseMoveEvent(event);
}
场景代码:
DiagramScene::DiagramScene(QObject *parent):
QGraphicsScene(parent)
{
}
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton) return;
BasicDiagramItem *item;
item = new BasicDiagramItem();
//item->setBrush()
addItem(item);
item->setPos(mouseEvent->scenePos());
QGraphicsScene::mousePressEvent(mouseEvent);
}
void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
QGraphicsScene::mouseMoveEvent(mouseEvent);
}
void DiagramScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
QGraphicsScene::mouseReleaseEvent(mouseEvent);
}
此代码与Qt示例相似。我只是不使用模式创建不同的对象,不使用自定义菜单,我不画箭头。
所以,我做错了什么?为什么应用程序有双击错误?
So, what i do wrong? Why apps have a bug with double-click?
我觉得是这个原因:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton) return;
请注意,在 single-left-click 上,mousePressEvent() 只是 returns 没有做任何事情;这可以解释为什么当你 single-left-click 时什么也没有发生。 (在 double-click、OTOH 上,改为调用 mouseDoubleClickEvent(),并且由于您没有覆盖 mouseDoubleClickEvent(),因此调用 QGraphicsScene::mouseDoubleClickEvent() 方法并处理那里的点击。
我想你想做的是:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton)
{
QGraphicsScene::mousePressEvent(mouseEvent); // call up to superclass
return;
}
[...]
这样,QGraphicsScene::mousePressEvent(mouseEvent) 可以完成选择用户单击的项目的工作。