pyqt的学习(三)----鼠标点击和按键处理

简介: pyqt的学习(三)----鼠标点击和按键处理

QmyChartView 类的说明

QChart 和 QChartView 是基于 Graphics View 结构的绘图类。要对一个 QChart 图表进行鼠

标和按键操作,需要在 QChartView 类里对鼠标和按键事件进行处理,这就需要自定义一个

从 QChartView 继承的类。

QmyChartView 类是从 QChartView 类继承的用作图表的视图组件,实现了鼠标、按键事件

的处理,能够在鼠标移动时发射信号 mouseMove(),鼠标框选中一个矩形区域时放大显示此

区域,通过按键进行图表缩放和移动操作。

class QmyChartView(QChartView):
    mouseMove=pyqtSignal(QPoint)##鼠标移动
   
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setDragMode(QGraphicsView.DragMode.RubberBandDrag)
       
        self.__beginPoint=QPoint()
        self.__endPoint=QPoint()

在类中,定义了一个信号 mouseMove(QPoint)。在 mouseMoveEvent 里发射此信号并传递

鼠标光标处的屏幕坐标,用于在主窗口里实现鼠标在图表上移动时显示当前位置的坐标。

在构造函数中,通过 setDragMode()将视图组件鼠标拖动选择方式设置为“橡皮框”形式。这

样,在图标上按下鼠标框选时,随着鼠标拖动会显示一个矩形选择框,如图所示:


(一) 鼠标的事件函数:


def mousePressEvent(self, event):##鼠标单击
        if event.button()==Qt.MouseButton.LeftButton:
            self.__beginPoint=event.pos()
        super().mousePressEvent(event)
       
    def mouseMoveEvent(self, event):##鼠标移动
        point=event.pos()
        self.mouseMove.emit(point)
        super().mouseMoveEvent(event)
       
    def mouseReleaseEvent(self, event):##鼠标框选放大,右键恢复
        if event.button()==Qt.MouseButton.LeftButton:
            self.__endPoint=event.pos()
            rectF=QRectF()
            rectF.setTopLeft(self.__beginPoint.toPointF())
            rectF.setBottomRight(self.__endPoint.toPointF())
            self.chart().zoomIn(rectF)
        elif event.button()==Qt.MouseButton.RightButton:
            self.chart().zoomReset()#鼠标右键释放,resetZoon


(1)mousePressEvent:在鼠标左键或右键按下时触发的事件函数。self.__beginPoint 记录

左键按下时,鼠标在视图组件中的位置。

(2)mouseMoveEvent: 鼠标在图表上移动时触发的事件函数,通过 event.pos()获取鼠标

在视图组件中的坐标 point,然后发射信号 mouseMove(point)。在使用 QmyChartView 类组 件的主窗口里,可以定义槽函数与此信号关联,通过传递的参数将视图坐标变换为图表的坐

标,从而实现鼠标光标处的坐标数值实时显示。

(3)mouseReleaseEvent:在鼠标左键或右键释放时触发的事件函数。若是鼠标左键释放,

则用 self.__endPoint 记录鼠标位置坐标。self.__beginPoint 和 self.__endPoint 就定义了鼠标

框选的矩形区域,用关联的 QChart 组件的 zoomIn(QRectF)函数对这个矩形区域进行放大。

注意这里rectF的类型是QRectF,所以需要用toPointF将__beginPoint和__endPoint从QPoint

类型转换为 QPointF 类型。

(二)键盘按键事件函数

def keyPressEvent(self, event):
            key=event.key()
            if key ==Qt.Key.Key_Plus:# +
                self.chart().zoom(1.2)
            elif key ==Qt.Key.Key_Minus:# -
                self.chart().zoom(0.8)
            elif key==Qt.Key.Key_Left: #向左
                self.chart().scroll(10, 0)
            elif key ==Qt.Key.Key_Right:#向右
                self.chart().scroll(-10, 0)
            elif key==Qt.Key.Key_Up:#向上
                self.chart().scroll(0, -10)
            elif key==Qt.Key.Key_Down:#向下
                self.chart(0, 10)
            elif key==Qt.Key.Key_PageUp:#pageup
                self.chart().scroll(0, -50)
            elif key==Qt.Key.Key_PageDown:#pagedown
                self.chart().scroll(0, 50)
            elif key ==Qt.Key.Key_Home:#home
                self.chart().zoomReset()


keyPressEvent 是键盘按键按下时触发的事件函数,从 event.key()可以获得按下按键的名称,

判断按键然后做出缩放、移动等动作


目录
相关文章
|
11天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
2天前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
13天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
17天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
16天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
13天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
11天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
13天前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。
|
13天前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!
|
19天前
|
安全 程序员 Python
Python学习的自我理解和想法(1)
本篇博客记录了作者跟随B站“黑马程序员”课程学习Python的第一天心得,涵盖了`print()`、`input()`、`if...else`语句、三目运算符以及`for`和`while`循环的基础知识。通过实际编写代码,作者逐步理解并掌握了这些基本概念,为后续深入学习打下了良好基础。文中还特别强调了循环语句的重要性及其应用技巧。