我正在尝试为我的 QGraphicsView 混合使用自定义光标和预设光标。 在我的实现中,我们为 View 创建了“模式”的概念。这意味着根据用户所处的“模式”,左键单击或左键单击拖动会发生不同的事情。无论如何,这些都不是问题,只是上下文。
当我尝试为每种模式更改光标时出现问题。例如,对于模式 1,我们希望显示常规箭头光标,但对于模式 2,我们希望使用自定义像素图。看似简单,我们在切换到模式 1 时调用 graphicsview->viewport()->setCursor(Qt::QArrowCursor)
,而 graphicsview->viewport()->setCursor(our custom cursor)
用于模式 2。除了它根本不起作用。
首先,光标不会变成自定义光标。这是第一个问题。但是,如果通过另一个操作将图形 View 的拖动模式设置为 ScrollHandDrag,则一旦拖动操作完成,光标将切换到自定义光标。诡异的。但是情节变浓了……一旦我们切换到自定义光标,无论我们调用多少次 setCursor(Qt::QArrowCursor)
,它都永远不会变回 ArrorCursor。我是在视口(viewport)上调用 setCursor 还是在图形 View 本身上调用似乎也无关紧要。
所以,为了好玩,我在要更改光标之前添加了对 graphicsview->unsetCursor()
的调用,这至少纠正了第二个问题。只要我们在两者之间做一点 HandDragging,光标就会改变得很好。更好,但肯定不是最优的。但是应该注意,在视口(viewport)上执行 unsetCursor 是行不通的。它绝对必须在 graphicsview 上完成 - 不管我们将光标设置在视口(viewport)上。
为了完全解决这个问题,我在设置光标后添加了这两行:
graphicsview->setDragMode(QGraphicsView::ScrollHandDrag);
graphicsview->setDragMode(QGraphicsView::NoDrag);
这行得通,但是你们这些 SCSS !!所以在这两个解决问题的方法中发生了一些神奇的事情,但是扫了一眼代码我没有看到什么。我想这与拖动模式正在改变光标这一事实有关。
为了完整起见,我还应该提到触发模式更改的是使用 QGraphicsScene->addWidget()
添加到场景中的 QPushButton。我不知道这是否与它有关,但你永远不知道。
我希望有人能澄清为什么我需要调用这些看似随意的电话。我不认为我在任何地方做错了什么。在此先感谢您的帮助。
编辑: 这是一个实际的代码示例,其中包含如上所述的游标补丁。您可以从下面的链接查看和/或下载它们。贴在这里有点长。我包括了围绕其更改光标的框架,因为我有一种有趣的感觉,即它在某种程度上很重要。
https://gist.github.com/712654
问题所在的代码在 MyGraphicsView.cpp 中,从第 104 行开始。这是在图形 View 中设置光标的位置。和上面描述的完全一样。
请记住,有了非常难看的补丁,光标或多或少会起作用。如果没有这些线,您将非常清楚地看到上面帖子中列出的问题。
链接中还包含使用 View 的主窗口的所有代码等...唯一缺少的是我正在使用的图像。但图像本身并不重要,任何 16x16 的 png 都可以。
最佳答案
我添加了一个 museReleaseEvent 来解决类似的问题......
void mouseReleaseEvent(QMouseEvent *event) {
QGraphicsView::mouseReleaseEvent(event);
viewport()->setCursor(Qt::CrossCursor);
}
这将在拖动事件完成后重置光标,在拖动过程中手将可见,这是有道理的。
关于c++ - QGraphicsView 和自定义游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4257922/