QGraphicsView和自定义游标

时间:2010-11-23 15:48:34

标签: c++ qt qt4

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

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

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

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

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

graphicsview->setDragMode(QGraphicsView::ScrollHandDrag);
graphicsview->setDragMode(QGraphicsView::NoDrag);

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

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

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

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

https://gist.github.com/712654

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

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

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

2 个答案:

答案 0 :(得分:4)

我的解决方案:

view->setDragMode( QGraphicsView::ScrollHandDrag );
QApplication::setOverrideCursor( Qt::ArrowCursor );

答案 1 :(得分:4)

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

void mouseReleaseEvent(QMouseEvent *event) {
     QGraphicsView::mouseReleaseEvent(event);
     viewport()->setCursor(Qt::CrossCursor);
}

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