PyQt5 笔记8 -- 鼠标、键盘事件

版权声明: https://blog.csdn.net/Wang_Jiankun/article/details/83651940

PyQt5 笔记8 – 鼠标、键盘事件


参考博客(鼠标事件)
参考博客(键盘事件)


1、鼠标事件


事件:

  • mousePressEvent (self, event):鼠标键按下事件
  • mouseReleaseEvent (self, event):鼠标键公开事件
  • mouseDoubieCiickEvent (self, event):双击鼠标事件
  • mouseMoveEvent(self,event):鼠标移动事件
  • enterEvent (self, event):鼠标进入控件事件
  • leaveEvent (self, event):鼠标离开控件事件
  • wheelEvent (self, event):滚轮滚动事件

方法:

  • ignore():让父控件继续收到鼠标事件
  • accept():不让父控件继续收到鼠标事件
  • x()、y():返回相对于控件空间的鼠标坐标值
  • pos():返回相对于控件空间的QPoint对象
  • localPos():返回相对于控件空间的QPointF对象
  • globalX()、globalY():返回相对于屏幕的x,y 坐标值
  • globalPos():返回相对于屏幕的QPoint对象
  • windowPos():返回相对于窗口的QPointF对象
  • screenPos():返回相对于屏幕的QPointF对象
  • angleDelta( ):返回QPoint对象,为滚轮转过的数值,单位为1/8度。angleX=event.angleDelta( ) .x(),angleY=event.angleDelta( ) .y()
  • button():返回枚举值,用以判断是哪个鼠标健触发了事件
  • QtCore.Qt.NoButton - 0 - 没有按下鼠标键。例如移动鼠标时的button()返回值
  • QtCore.Qt.LeftButton - 1 - 按下鼠标左键
  • QtCore.Qt.RightButton - 2 - 按下鼠标右键
  • QtCore.Qt.Mion/QtCore.Qt.MiddleButton - 4 -按下鼠标中键
  • buttons():返回前面所列枚举值的组合,用于判断同时按下了哪些键
  • modifiers():判断按下了哪些修饰键(Shift,Ctrl , Alt,等),详见键盘事件的modifiers()
  • timestamp():返回事件发生的时间;

  • mapToGlobal (QPoint):将窗口坐标转换成屏幕坐标
  • mapFromGlobal(QPoint):将屏幕坐标转换成窗口坐标
  • mapToParent(QPoint):将窗口坐标转换成父窗口坐标。如果没有父窗口,则相当于mapToGlobal (QPoint)
  • mapFromParent(QPoint):将父窗口坐标转换成窗口坐标。如果没有父窗口,则相当于mapFromGlobal(QPoint)
  • mapTo (QWidget, QPoint):将窗口坐标转换成 QWidget父窗口坐标
  • mapFrom (QWidget, QPoint):将 QWidget父窗口坐标转换成窗口坐标

  • setCursor(QCursor qcr):参数qcr为QCursor对象或 Qtcore.Qt 类的枚举值,如:ArrowCursor(标准箭头)、upArrowCursor(向上箭头)、 CrossCursor(十字光标)、Waitcursor (沙漏),等等
  • setCursor(QtCore.Qt.WaitCursor)
  • unsetCursor() - 取消设置的鼠标形状
  • cursor() - 返回当前鼠标形状的QCursor对象,使用QApplication类中的以下静态方法来控制整个应用程序的鼠标形状:
    • setOverrideCursor(QCursor qcr):参数qcr为QCursor对象或 Qtcore.Qt 类的枚举值
    • restoreOverrideCursor():取消全局鼠标形状设置,setOverrideCursor()和restoreOverrideCursor( )通常配合使用。
    • changeOverrideCursor(QCursor qcr):将鼠标形状设置为qcr。只有先调用setOverrideCursor( )了,该函数才起作用
    • overrideCursor( ) - 返回当前鼠标形状的QCursor 对象

实例:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton
from PyQt5.QtCore import QObject, Qt, pyqtSignal

# 自定义信号类
class MySignal(QObject):
    instance = None
    status_signal = pyqtSignal(str)

    @classmethod
    def my_signal(cls):
        if cls.instance:
            return cls.instance
        else:
            obj = cls()
            cls.instance = obj
            return cls.instance
            
    def status_emit(self, s):
        self.status_signal.emit(s)


# 自定义按钮类,继承自QPushButton
class MyPushButton(QPushButton):
    def __init__(self, *args):
        super(MyPushButton, self).__init__(*args)		
		# 打开鼠标追踪,如果不打开只有鼠标按下才会同时触发鼠标移到事件
        self.setMouseTracking(True)
	
	# 重写QPushButton中的鼠标移动事件
    def mouseMoveEvent(self, event):
        # 触发信号,并携带鼠标位置的字符串
		MySignal.my_signal().status_emit(str(event.pos().x())+str(event.pos().y()))
        self.update()

class MainWindow(QMainWindow):
    """
    主窗口类
    """
    Status_signal = MySignal.my_signal().status_signal

    def __init__(self, *args):
        super(MainWindow, self).__init__(*args)

        # 设置主窗口的标题及大小
        self.setWindowTitle('主窗口')
        self.resize(400, 300)

       # 使自定义的按钮类来实例化按钮
        self.btn = MyPushButton(self)
        self.btn.setText('自定义按钮')
        self.btn.move(50, 50)
        self.btn.clicked.connect(self.show_dialog)

        # 自定义信号绑定
        self.Status_signal.connect(self.show_status)
     
     # 在状态栏中显示字符串
    def show_status(self, s):
        self.statusBar().showMessage(s)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = MainWindow()
    demo.show()
    sys.exit(app.exec())

在这里插入图片描述


2、键盘事件


事件:

  • keyPressEvent(self, event):键盘按下事件
  • focusInEvent(self, event):获得焦点事件
  • focusOutEvent(self,even):失去焦点事件

方法:

  • setFocus([reason]) - 如果控件在活动窗口中,调用此方法后,该控件成为输入焦点。reason参数可为QtCore.Qt类中的以下枚举变量:
    • MouseFocusReason(0):使用鼠标获得焦点;
    • TabFocusReason(1):按下了Tab键
    • BacktabFocusReason(2):按下了组合键
    • ActiveWindowFocusReason(3):窗口变为活动和非活动
    • PopupFocusReason(4):打开或关闭弹出窗口
    • ShortcutFocusReason(5):按下快捷键
    • MenuBarFocusReason(6):通过菜单操作
    • OtherFocusReaaon(7):其他方式
  • clearFocus():去除输入焦点
  • hasFocus():如果控件是输入焦点,返回True;否则,返回False;

实例:

# 重写键盘按下事件
def keyPressEvent(self, event):
	# 如果按下xxx则xxx
    if event.key() == Qt.Key_Home:
        print('Home')
	# 组合键
    elif (event.key() == Qt.Key_P):
       if QApplication.keyboardModifiers() == Qt.ShiftModifier:
           print('shift + p')
       else :
           print('p')
    else:
        QWidget.keyPressEvent(self, event)

猜你喜欢

转载自blog.csdn.net/Wang_Jiankun/article/details/83651940