pyqt5中的画布上空白光标行为

时间:2019-02-02 15:07:43

标签: cursor pyqt5 hide

我正在用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_()) 

0 个答案:

没有答案