我正在使用 PyQt5 作为 Python 3.7 创建GUI的应用程序。我想在应用程序中自定义鼠标光标。
让我们从 Qt5 中设置的标准光标开始,如下表所示:
https://doc.qt.io/qt-5/qt.html#CursorShape-enum。您会注意到Qt5有一个专用的Enum Qt::CursorShape
,描述了相应游标的作用。例如:
我想用制作成一个的自定义替换每个标准Qt光标:
起初我尝试过这样的事情:
pixmap = QPixmap("C:/../my_arrow.png")
cursor = QCursor(pixmap, 32, 32)
QApplication.setOverrideCursor(cursor)
不幸的是,这种方法对我的目的不利。从文档中:
应用程序覆盖游标旨在用于向用户显示应用程序处于特殊状态,例如,在操作过程中可能会花费一些时间。
覆盖光标将显示在应用程序的所有小部件中,直到调用restoreOverrideCursor()
或另一个setOverrideCursor()
。
换句话说,使用setOverrideCursor()
方法有两个缺点:
我将不得不手动跟踪鼠标指针应更改为哪个角色,每次调用setOverrideCursor()
并向其输入正确的QCursor()
。
我需要跟踪Qt自动调用restoreOverrideCursor()
的位置,因为这实际上会撤消我自己的更改。与Qt的斗争将是永恒的。
我的第二种方法是使用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()
函数不是这样工作的。
您有最适合我目的的解决方案吗?
我从以下来源学到了很多东西:
不幸的是,他们都没有提供解决我问题的方法。我在这里只提到它们,是因为它们与我要执行的操作有关-但与(!)不同。