Поведение пустого курсора на холсте в pyqt5 - PullRequest
0 голосов
/ 02 февраля 2019

Я пишу графический интерфейс с 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_()) 
...