Я пишу графический интерфейс с pyqt5 (версия 5.9.2), и мне нужно иметь два холста в одном окне: canvas1 слева и canvas2 справа.Я создал класс для каждого холста и хотел бы изменить внешний вид курсора только на левом холсте .Курсор, который я хочу (большой крест), отсутствует в списке QCursor, поэтому я использую setOverrideCursor, чтобы скрыть курсор всякий раз, когда я нахожусь над осями canvas1, и вместо этого нанести крест на позицию (скрытого) курсора.Я также реализую методEventEvent, чтобы курсор снова появлялся, когда я покидаю canvas1.
Пока все хорошо.Однако, когда я вхожу в canvas2 и покидаю его, мой курсор исчезает , чего я никогда не ожидал, учитывая, что, если что-нибудь, событие exit холста1 настроено так, чтобы вместо него появился курсор.
Я замечаю это поведение только при одновременном выходе из canvas1 и его осей , например, с верхней части панели в примере ниже.Если я сначала оставлю оси, а затем canvas1 (например, справа), курсор будет вести себя нормально.
Я обнаружил, что если я переопределю функцию leftEvent в классе canvas2, чтобы сделать абсолютно ничего (это2 закомментированные строки в коде ниже), это поведение исчезает.Кто-нибудь может объяснить, что происходит и как правильно решить эту проблему, не добавляя фиктивный файл leftEvent?
Пожалуйста, найдите тестовый код, чтобы воспроизвести это поведение:
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_())