代码之家  ›  专栏  ›  技术社区  ›  Etienne de Martel

QGraphicsView和自定义游标

  •  7
  • Etienne de Martel  · 技术社区  · 14 年前

    我正在尝试为我的QGraphicsView混合使用自定义游标和预置游标。 在我的实现中,我们为视图创建了一个“模式”的概念。这意味着,根据用户所处的“模式”,在左键单击或左键单击拖动时会发生不同的情况。不管怎样,这些都不是问题,只是环境问题。

    当我尝试为每个模式更改光标时,问题就出现了。例如,对于模式1,我们希望显示常规箭头光标,但是对于模式2,我们希望使用自定义pixmap。看似简单我们称之为 graphicsview->viewport()->setCursor(Qt::QArrowCursor) 当我们切换到模式1时 graphicsview->viewport()->setCursor(our custom cursor) 对于模式2。只是根本不起作用。

    首先,光标不会更改为自定义光标。这是第一个问题。但是,如果通过另一个操作将图形视图的拖动模式设置为ScrollHandDrag,则一旦拖动操作完成,光标将切换到自定义光标。奇怪的。但情节越来越复杂。。。一旦切换到自定义光标,无论调用多少次,都无法将其更改回ArrorCursor setCursor(Qt::QArrowCursor) . 无论是在视区调用setCursor,还是在图形视图本身调用setCursor,似乎都无关紧要。

    为了好玩,我给 graphicsview->unsetCursor() 就在我们想要改变光标之前,这至少纠正了第二个问题。只要我们在两者之间做一点手动拖动,光标就可以很好地改变。更好,但肯定不是最优的。但是,应该注意的是,在视口上执行unsetCursor不起作用。这绝对必须在graphicsview上完成—不管我们是在视口上设置光标。

    为了彻底解决这个问题,我在设置光标后添加了这两行:

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

    行得通,但你们这些游民!!所以在这两个方法中发生了一些神奇的事情,修复了这个问题,但是看看代码,我不知道是什么。与拖动模式正在改变光标这一事实有关。

    为了完整起见,我还应该提到触发模式更改的是一个QPushButton,它是使用 QGraphicsScene->addWidget() . 我不知道这是否与此有关,但你永远不知道。

    我希望有人能澄清我为什么要打这些看似随机的电话。我认为我在任何地方都没有做错什么。提前谢谢你的帮助。

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

    https://gist.github.com/712654

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

    请记住,有了非常丑陋的补丁的地方,光标做的工作-或多或少。如果没有这些台词,你会清楚地看到上面所列的问题。

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   ponchietto    12 年前

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

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

    这将在拖动事件完成后重置光标,在拖动期间,指针将可见,这是有意义的。

        2
  •  4
  •   Jarikus    13 年前

    我的解决方案:

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