c++ - QGraphicsView 和自定义游标

标签 c++ qt qt4

我正在尝试为我的 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/

相关文章:

c++ - 映射/设置迭代器不可取消引用运行时错误

c++ - 标准复制问题

c++ - 在 QT 中,是否有用于 double、float、int... 等的动态数组,即 QDoubleArray?

c++ - QT什么时候不允许一行多次转换,比如QString to char*

c++ - 使 QMap 中的指针值无效

c++ - 为什么在 ubuntu linux 的 c++ 的 g++ 编译器中局部变量被初始化为 0?

c++ - 通过 uva 的中值程序

qt4 - QtGui QTreeWidgetItem setData 持有 float

c++ - qt:继承父类(super class)的 invokemethod 返回值不正确

qt - QT中如何获取Buttons的paint事件