我的简单代码基于Qt标准示例'图表场景'。 MainWindow最简单,只加载自定义场景。用户界面是图形编辑器。 使用鼠标右键拖动和移动图形多边形,左侧创建新项目。所以? 我必须双击项目才能选择它。当我想要移动项目时,项目需要双击而没有释放最后一次点击。完全晕了。
商品代码:
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示例相似。我只是不使用模式创建不同的对象,不要使用cutom菜单,我不画箭头。
那么,我做错了什么?为什么应用程序有双击错误?
答案 0 :(得分:1)
那么,我做错了什么?为什么应用程序有双击错误?
我认为这就是原因:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton) return;
请注意,在单击左键单击时,mousePressEvent()只返回而不执行任何操作;这可以解释为什么单击左键时没有任何反应。 (在双击时,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)可以完成选择用户点击的项目的工作。