我正在用pyqt5(版本5.9.2)编写一个GUI,并且我需要在同一窗口上有两个画布:左边的canvas1和右边的canvas2。我为每个画布创建了一个类,并希望仅在左侧画布上更改光标外观。我想要的光标(一个大十字)不在QCursor列表中,因此,每当我在canvas1的轴上时,我都使用setOverrideCursor隐藏该光标,然后在(隐藏)光标的位置绘制十字。我还实现了LeaveEvent,使我在离开canvas1时再次显示光标。
到目前为止,一切都很好。但是,当我进入canvas2并离开它时,我的光标消失,这是我从未想到的行为,因为如果有的话,canvas1的离开事件被设置为使光标出现。
仅当同时离开canvas1及其轴 (例如,在下面的示例中,从面板顶部开始。如果我先离开坐标轴,然后再离开canvas1(例如从右侧),则光标将正常运行。
我发现,如果我重新实现canvas2类中的离开事件以完全不执行(以下代码中的2条注释行),则此行为消失。任何人都可以解释正在发生的事情以及如何正确解决它,而无需添加虚拟的LeaveEvent吗?
请找到测试代码以重现此行为:
from PyQt5.QtGui import QCursor
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QHBoxLayout, QWidget, QDialog
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
class MyGUI(QDialog):
def __init__(self, parent=None):
super(MyGUI, self).__init__(parent)
mainLayout = QHBoxLayout()
canvas1 = Canvas1(self)
canvas2 = Canvas2(self)
mainLayout.addWidget(canvas1)
mainLayout.addWidget(canvas2)
self.setLayout(mainLayout)
class Canvas1(FigureCanvas):
def __init__(self, parent=None):
fig = Figure()
FigureCanvas.__init__(self, fig)
self.axes = fig.add_subplot(111)
fig.subplots_adjust(left=.15,bottom=0.,right=.85,top=1.)
self.mpl_connect('motion_notify_event', self.hover)
self.cursor = self.axes.plot([0], [0], marker = '+',ms=10000)[0]
def leaveEvent(self, QEvent):
QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor))
def hover(self, event):
if event.inaxes == self.axes:
QApplication.setOverrideCursor(QCursor(Qt.BlankCursor))
self.cursor.set_data([event.xdata], [event.ydata])
else:
QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor))
self.draw()
class Canvas2(FigureCanvas):
def __init__(self, parent=None):
fig = Figure()
FigureCanvas.__init__(self, fig)
self.axes = self.figure.add_subplot(111)
# def leaveEvent(self, QEvent):
# return
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
gallery = MyGUI()
gallery.show()
sys.exit(app.exec_())