Python 有没有办法创建自定义动画/gif QCursor?
我正在尝试创建一个custum动画光标,当发生类似的长过程时,它将取代常规光标。但是,我希望我的光标是动画的,例如使用gif,就像标准的Python 有没有办法创建自定义动画/gif QCursor?,python,pyqt,pyqt5,qcursor,Python,Pyqt,Pyqt5,Qcursor,我正在尝试创建一个custum动画光标,当发生类似的长过程时,它将取代常规光标。但是,我希望我的光标是动画的,例如使用gif,就像标准的Qt.WaitCursor一样。我该怎么做?我找到了有关动画系统托盘图标的解决方案,但是,我没有设法使其适应光标图标 作为旁注:当我尝试执行第一个链接中所述的pm.setAlphaChannel(bm)时,它对我不起作用,我得到以下错误: 'AttributeError: QPixmap' object has no attribute 'setAlphaCha
Qt.WaitCursor
一样。我该怎么做?我找到了有关动画系统托盘图标的解决方案,但是,我没有设法使其适应光标图标
作为旁注:当我尝试执行第一个链接中所述的pm.setAlphaChannel(bm)
时,它对我不起作用,我得到以下错误:
'AttributeError: QPixmap' object has no attribute 'setAlphaChannel'
这很奇怪,因为根据,QPixmap确实有一个
setAlphaChannel
方法。一个可能的解决方案是创建一个类来处理给定小部件光标的更新。在以下示例中,按下开始按钮时设置光标,按下停止按钮时恢复光标:
from PyQt5 import QtCore, QtGui, QtWidgets
class ManagerCursor(QtCore.QObject):
def __init__(self, parent=None):
super(ManagerCursor, self).__init__(parent)
self._movie = None
self._widget = None
self._last_cursor = None
def setMovie(self, movie):
if isinstance(self._movie, QtGui.QMovie):
if not self._movie != QtGui.QMovie.NotRunning:
self._movie.stop()
del self._movie
self._movie = movie
self._movie.frameChanged.connect(self.on_frameChanged)
self._movie.started.connect(self.on_started)
self._movie.finished.connect(self.restore_cursor)
def setWidget(self, widget):
self._widget = widget
@QtCore.pyqtSlot()
def on_started(self):
if self._widget is not None:
self._last_cursor = self._widget.cursor()
@QtCore.pyqtSlot()
def restore_cursor(self):
if self._widget is not None:
if self._last_cursor is not None:
self._widget.setCursor(self._last_cursor)
self._last_cursor = None
@QtCore.pyqtSlot()
def start(self):
if self._movie is not None:
self._movie.start()
@QtCore.pyqtSlot()
def stop(self):
if self._movie is not None:
self._movie.stop()
self.restore_cursor()
@QtCore.pyqtSlot()
def on_frameChanged(self):
pixmap = self._movie.currentPixmap()
cursor = QtGui.QCursor(pixmap)
if self._widget is not None:
if self._last_cursor is None:
self._last_cursor = self._widget.cursor()
self._widget.setCursor(cursor)
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
start_btn = QtWidgets.QPushButton("start", clicked=self.on_start)
stop_btn = QtWidgets.QPushButton("stop", clicked=self.on_stop)
self._manager = ManagerCursor(self)
movie = QtGui.QMovie("loading-icon.gif")
self._manager.setMovie(movie)
self._manager.setWidget(self)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(start_btn)
lay.addWidget(stop_btn)
lay.addStretch()
@QtCore.pyqtSlot()
def on_start(self):
self._manager.start()
@QtCore.pyqtSlot()
def on_stop(self):
self._manager.stop()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
你是什么意思?谢谢你的提问!我添加了信息。pyqt5和动画我的意思是像gif的东西,例如。例如,在Windows 10中,您有一个旋转的蓝环。我想替换它。好吧,如果你读了我之前的评论,没关系!我的gif文件路径出错,因此无法加载。不过,我希望在这种情况下会出现错误消息,这就是为什么我花了这么长时间才找到它的原因。有趣的是,QMovie只是忽略了一个不正确的文件路径。@出于效率原因,mapf Qt不使用异常,在本例中,假设您创建了一个空的QMovie,如果您想验证是否加载了gif,您应该使用isValid()方法:print(movie.isValid())很好!谢谢抱歉,如果这是吹毛求疵,但我有一个后续问题:当我使用所描述的方法时,即
QApplication.setOverrideCursors(Qt.WaitCursor)
,光标保持不变(就像在旋转圆环中保持不变一样),并且无论您将鼠标悬停在何处都会不断更新。但是,使用您的方法,情况并非如此。例如,如果您将光标悬停在窗口的框架或文本字段上,并且由于某种原因,当我使用pickle(第二个线程)加载数据时,光标不会更新。@mapf如果您有其他问题(可能与我回答的问题类似),则必须创建新的出版物。