c++ - QGraphicsItem::SetCursor 不会取消选择

标签 c++ qt

全部,

我有一个带有 setFlags(Qt::ItemIsSelectable | Qt::ItemIsMovable)QGraphicsEllipseItem。这允许我在 QGraphicsView 中快速拖动和移动椭圆。

我决定花点心思,setCursor(Qt::OpenHandCursor) 让用户知道他们可以通过点击来移动它。可是,现在松开鼠标左键它就不松手了?我做错了什么?


示例代码:Custom QGraphicItem and Repaint Issues

注意:我删除了 update() 调用,并添加了 prepareGeometryChange() 调用。 现在修改 MakeNewPoint 函数:

QGraphicsEllipseItem * InteractivePolygon::MakeNewPoint(QPointF & new_point)
{
   QGraphicsEllipseItem * result = 0;
   result = new QGraphicsEllipseItem();
   result->setPos(new_point);
   result->setRect(-4, -4, 8, 8);
   result->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable)
   result->setCursor(Qt::OpenHandCursor); //Setting this removes my ability to let go of an item. NOTE: result is parented by this.

   return result;
}

后来:

 QGraphicsEllipseItem * new_item = MakeNewPoint(bla);
 new_item->setParent(this);
 //add it to my QList<QGraphicsEllipseItem *> m_points;

我想指出,我的 QGraphicsEllipseItem 是自定义 QGraphicsItem 的父级。我不改变 parent /自定义项目光标,只改变椭圆的。我没有遇到非父级省略号的问题...


有趣的结果:所以我的类自定义 QGraphicsItem 类(省略号的父级)是一个 QObject,因此我可以过滤来自场景的传入鼠标事件。我在自定义类的构造函数中执行了 setCursor(Qt::ArrowCursor)...这就是它变得有趣的地方:

eventFilter 现在捕获 (event->type() == QEvent::GraphicsSceneMouseMove) 即使没有按下鼠标按钮。如果我没有 setCursor 调用,该事件只会在按下鼠标按钮时触发……想法?

最佳答案

好的,明白了,这是正在发生的事情,一旦你意识到它是直观的:

当您将 QGraphicsItem 设置为唯一光标时,QGraphicsView 必须 setMouseTracking(true) 否则 QGraphicsScene 将永远不知道何时更改光标(即当光标位于具有唯一光标的图形项上时。)鼠标移动事件影响了我的椭圆。

通常,QGraphicsScene 仅在按住按钮时获取鼠标移动事件。

关于c++ - QGraphicsItem::SetCursor 不会取消选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13293584/

相关文章:

c++ - 为什么 MFC CDocument 有 SetTitle 方法而不是 CFrameWnd

python - 在 OS X 上编写一个全屏不可关闭的窗口

C++ C4244 =': conversion from ' std::streamsize' 到 'unsigned short' ,可能丢失数据;任何解决方案?

c++ - Qt QFile/QTextStream,无法解析/proc/stat

QT:使用 QT Creator 对 ARM 进行远程调试挂起,命令行 GDB 运行正常

带不完整参数的 C++ 函数调用

c++ - 什么时候应该将对象置于 "resting"物理状态?

c++ - Qt - Visual Studio 中的 C++ 图形应用程序

c++ - QList拷贝构造函数:how to new a QList<QStandardItem *> with variable

c++ - 使用 Qt,有什么好方法可以分解包含 GUI 逻辑的大型源文件?