QGraphicsView和自定义游标

Eti*_*tel 7 c++ qt qt4

我正在尝试为我的QGraphicsView使用自定义游标和预设游标的混合.在我的实现中,我们为视图创建了"模式"的概念.这意味着根据用户所处的"模式",左键单击或左键单击拖动会发生不同的事情.无论如何,这不是问题,只是上下文.

当我尝试更改每个模式的光标时出现问题.例如,对于模式1,我们想要显示常规箭头光标,但对于模式2,我们想要使用自定义像素图.graphicsview->viewport()->setCursor(Qt::QArrowCursor)  我们在切换到模式1和graphicsview->viewport()->setCursor(our custom cursor)模式2 时看起来很简单.除了它根本不起作用.

首先,光标不会更改为自定义光标.这是第一个问题.但是,如果通过另一个操作,图形视图的拖动模式设置为ScrollHandDrag,则一旦拖动操作完成,光标将切换到自定义光标.奇怪的.但情节变浓了......一旦我们切换到自定义光标,无论我们调用多少次,它都永远不会变回ArrorCursor setCursor(Qt::QArrowCursor).我是否在视口或图形视图本身上调用setCursor似乎并不重要.

所以,为了好玩,我graphicsview->unsetCursor()在我们想要更改光标之前添加了一个调用,这至少可以解决第二个问题.只要我们在它们之间做一点HandDragging,光标就会变好.更好,但肯定不是最佳的.但是应该注意,在视口上执行unsetCursor不起作用.它绝对必须在graphicsview上完成 - 无论我们是否在视口上设置光标.

为了完全修补问题,我在设置光标后添加了这两行:

graphicsview->setDragMode(QGraphicsView::ScrollHandDrag);
graphicsview->setDragMode(QGraphicsView::NoDrag);
Run Code Online (Sandbox Code Playgroud)

哪个有效,但你们加油!所以在这两个方法中发生了一些神奇的事情来修复问题,但是看了一下我看不到的代码.与拖动模式正在改变我想象的光标这一事实有关.

为了完整起见,我还应该提到触发模式更改的事情是使用已添加到场景中的QPushButton QGraphicsScene->addWidget().我不知道这与它有什么关系,但你永远不知道.

我希望有人能澄清为什么我需要做这些看似随机的电话.我不认为我在任何地方做错了什么.在此先感谢您的帮助.

编辑:这是一个实际的代码示例,其中包含如上所述的光标补丁.您可以从以下链接查看和/或下载它们.粘贴这里有点长.我包含了游标更改的框架,因为我有一种有趣的感觉,这在某种程度上很重要.

https://gist.github.com/712654

问题所在的代码是从第104行开始的MyGraphicsView.cpp.这是在图形视图中设置光标的位置.完全如上所述.

请记住,游标可以使用非常难看的补丁 - 或多或少.没有这些线条,您将非常清楚地看到上面帖子中列出的问题.

链接中还包含使用视图等的mainWindow的所有代码...唯一缺少的是我正在使用的图像.但是图像本身并不重要,任何16x16 png都可以.

pon*_*tto 4

我添加了一个 museReleaseEvent 来解决类似的问题......

void mouseReleaseEvent(QMouseEvent *event) {
     QGraphicsView::mouseReleaseEvent(event);
     viewport()->setCursor(Qt::CrossCursor);
}
Run Code Online (Sandbox Code Playgroud)

这将在拖动事件完成后重置光标,在拖动过程中手将可见,这是有意义的。