C++ Qt-拖动移动qgraphicsitem don';工作不好
我的简单代码基于Qt标准示例“图表场景”。主窗口最简单,只加载自定义场景。用户界面是在图形编辑器中生成的。 拖动和移动图形多边形使用鼠标右键,左键创建新项目。所以 我必须双击该项目以选择它。项目需要双击,无需释放上次单击,当我想要移动项目时。他头晕目眩 项目代码:C++ Qt-拖动移动qgraphicsitem don';工作不好,c++,qt,graphics,scene,C++,Qt,Graphics,Scene,我的简单代码基于Qt标准示例“图表场景”。主窗口最简单,只加载自定义场景。用户界面是在图形编辑器中生成的。 拖动和移动图形多边形使用鼠标右键,左键创建新项目。所以 我必须双击该项目以选择它。项目需要双击,无需释放上次单击,当我想要移动项目时。他头晕目眩 项目代码: BasicDiagramItem::BasicDiagramItem(QGraphicsItem *parent): QGraphicsPolygonItem(parent) { drawCustomPoly(); }
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示例相似。我只是不使用模式创建不同的对象,不使用自定义菜单,也不绘制箭头
那么,我做错了什么?为什么应用程序会出现双击错误
那么,我做错了什么?为什么应用程序会出现双击错误
我想这就是原因:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton) return;
请注意,只需单击鼠标左键,MousePresseEvent()就会返回,而不做任何操作;这就解释了为什么单击鼠标左键时什么也没发生。(双击OTOH时,会调用mouseDoubleClickEvent(),因为您尚未重写mouseDoubleClickEvent(),因此会调用qgraphicscene::mouseDoubleClickEvent()方法并在此处处理单击
我想你要做的是:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton)
{
QGraphicsScene::mousePressEvent(mouseEvent); // call up to superclass
return;
}
[...]
通过这种方式,QGraphicscene::MousePresseEvent(mouseEvent)可以选择用户单击的项目。这里有你想问的问题吗?Thx,我忘记了直接写问题。在我看来,我有连接错误运行=关于此的问题。现在我编辑帖子:)谢谢!我太笨了:这工作太棒了。对于后代:示例可能会产生误导,因为示例在错误按钮(但将项目移动到)和下一个切换框时使用“裸”返回来创建不同的对象。有点头晕。再次感谢:)