PyQt5:如何为每个角色设置自定义鼠标指针?

时间:2019-05-15 08:42:38

标签: python qt pyqt qt5 pyqt5

1。简介

我正在使用 PyQt5 作为 Python 3.7 创建GUI的应用程序。我想在应用程序中自定义鼠标光标。

让我们从 Qt5 中设置的标准光标开始,如下表所示: https://doc.qt.io/qt-5/qt.html#CursorShape-enum。您会注意到Qt5有一个专用的Enum Qt::CursorShape,描述了相应游标的作用。例如:

  

Qt standard cursors


我想用制作成一个的自定义替换每个标准Qt光标

  

Custom cursors


2。第一种方法

起初我尝试过这样的事情:

pixmap = QPixmap("C:/../my_arrow.png")
cursor = QCursor(pixmap, 32, 32)
QApplication.setOverrideCursor(cursor)

不幸的是,这种方法对我的目的不利。从文档中:

  

应用程序覆盖游标旨在用于向用户显示应用程序处于特殊状态,例如,在操作过程中可能会花费一些时间。
  
  覆盖光标将显示在应用程序的所有小部件中,直到调用restoreOverrideCursor()或另一个setOverrideCursor()

换句话说,使用setOverrideCursor()方法有两个缺点:

  1. 我将不得不手动跟踪鼠标指针应更改为哪个角色,每次调用setOverrideCursor()并向其输入正确的QCursor()

  2. 我需要跟踪Qt自动调用restoreOverrideCursor()的位置,因为这实际上会撤消我自己的更改。与Qt的斗争将是永恒的。


3。第二种方法

我的第二种方法是使用setCursor()函数:

pixmap = QPixmap("C:/../Arrow.png")
cursor = QCursor(pixmap, 32, 32)
my_widget.setCursor(cursor)

我在顶级窗口小部件QMainWindow()上执行此操作,以便将效果应用于整个应用程序。

它的效果很好,但有一个缺点。此功能仅更改“默认光标”(指向箭头),仅此而已。所有特殊光标仍然相同。


实际上,我想做这样的事情:

# Note: 'mainwin' is the QMainWindow().
mainwin.setCursor( QCursor(QPixmap("C:/../Arrow.png"),     32, 32), Qt.ArrowCursor     )
mainwin.setCursor( QCursor(QPixmap("C:/../UpArrow.png"),   32, 32), Qt.UpArrowCursor   )
mainwin.setCursor( QCursor(QPixmap("C:/../Cross.png"),     32, 32), Qt.CrossCursor     )
mainwin.setCursor( QCursor(QPixmap("C:/../Wait.png"),      32, 32), Qt.WaitCursor      )
mainwin.setCursor( QCursor(QPixmap("C:/../IBeam.png"),     32, 32), Qt.IBeamCursor     )
mainwin.setCursor( QCursor(QPixmap("C:/../SizeVer.png"),   32, 32), Qt.SizeVerCursor   )
mainwin.setCursor( QCursor(QPixmap("C:/../SizeHor.png"),   32, 32), Qt.SizeHorCursor   )
mainwin.setCursor( QCursor(QPixmap("C:/../SizeBDiag.png"), 32, 32), Qt.SizeBDiagCursor )
mainwin.setCursor( QCursor(QPixmap("C:/../SizeFDiag.png"), 32, 32), Qt.SizeFDiagCursor )
...

不幸的是,setCursor()函数不是这样工作的。


您有最适合我目的的解决方案吗?

4。资源

我从以下来源学到了很多东西:

不幸的是,他们都没有提供解决我问题的方法。我在这里只提到它们,是因为它们与我要执行的操作有关-但与(!)不同。

0 个答案:

没有答案