QT 鼠标左键、中键、右键和滑轮事件及其鼠标位置获取

原理

重写GUI类中的鼠标事件的响应函数,并实现其响应函数。

代码如下

头文件

#include <QMouseEvent>

*.h

enum MouseState //自己定义的状态类型
{
    L_C,//left click
    R_C,
    M_C,
    L_DC,//left double click
    R_DC,
    Wheel,//wheel move
    Release
};
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void setMouseState(MouseState ms, int wheelVal);
    void setMouseUIdefault();

private:
    Ui::MainWindow *ui;


protected:  //mouse
    void mouseMoveEvent(QMouseEvent *event);         //移动
    void mousePressEvent(QMouseEvent *event);        //单击
    void mouseReleaseEvent(QMouseEvent *event);      //释放
    void mouseDoubleClickEvent(QMouseEvent *event);  //双击
    void wheelEvent(QWheelEvent *event);             //滑轮
    void keyPressEvent(QKeyEvent *event);            //键盘
};    

*.c

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{//移动(鼠标左键、右键、中键按压触发)


    QPoint p_ab = event->globalPos();
    QPoint p_re = event->pos();

    QString str;
    str = QString("%1 , %2").arg(p_ab.x()).arg(p_ab.y());
    ui->abs_lineEdit->setText(str);

    str = QString("%1 , %2").arg(p_re.x()).arg(p_re.y());
    ui->rel_lineEdit->setText(str);
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{//单击
    // 如果是鼠标左键按下
    if (event->button() == Qt::LeftButton){
        //qDebug() << "left click";
        setMouseState( MouseState::L_C, 0);
    }
    // 如果是鼠标右键按下
    else if (event->button() == Qt::RightButton){
        //qDebug() << "right click";
        setMouseState(MouseState::R_C, 0);
    }
    else if (event->button() == Qt::MidButton){
        //qDebug() << "mid click";
        setMouseState(MouseState::M_C, 0);
    }

}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{//释放
    setMouseState(MouseState::Release, 0);
}

void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{//双击
    // 如果是鼠标左键按下
    if (event->button() == Qt::LeftButton){
        //qDebug() << "left double click";
        setMouseState(MouseState::L_DC, 0);
    }
    else if (event->button() == Qt::RightButton){
        //qDebug() << "right double click";
        setMouseState(MouseState::R_DC, 0);
    }
}

void MainWindow::wheelEvent(QWheelEvent *event)
{//滚轮
    int wheel_val = event->delta();
    setMouseState(MouseState::Wheel, wheel_val);
    // 当滚轮远离使用者时
    //if (wheel_val > 0){
    //  qDebug() << "wheel forward: " << wheel_val;
    //}
    //else{//当滚轮向使用者方向旋转时
    //  qDebug() << "wheel backward: " << wheel_val;
    //}
}



void MainWindow::setMouseState(MouseState ms, int wheelVal)
{
    QString style_active = "border:2px solid black;background:green";
    QString style_release = "border:2px solid black;";
    setMouseUIdefault();
    switch (ms)
    {
    case L_C:
        ui->lab_mL->setStyleSheet(style_active);
        break;
    case R_C:
        ui->lab_mR->setStyleSheet(style_active);
        break;
    case M_C:
        ui->lab_mM->setStyleSheet(style_active);
        break;
    case L_DC:
        ui->lab_mL_D->setStyleSheet(style_active);
        break;
    case R_DC:
        ui->lab_mR_D->setStyleSheet(style_active);
        break;
    case Wheel:
        ui->lab_mM_val->setText(QString("%1").arg(wheelVal));
        if (wheelVal>0)
        {// 当滚轮远离使用者时
            ui->lab_mM_up->setStyleSheet(style_active);
            ui->lab_mM_down->setStyleSheet(style_release);
        }
        else
        {
            ui->lab_mM_up->setStyleSheet(style_release);
            ui->lab_mM_down->setStyleSheet(style_active);
        }
        break;

    case Release:
        setMouseUIdefault();
        break;
    }
}

void MainWindow::setMouseUIdefault()
{
    QString style_release = "border:2px solid black;";

    ui->lab_mR_D->setStyleSheet(style_release);
    ui->lab_mR->setStyleSheet(style_release);
    ui->lab_mL_D->setStyleSheet(style_release);
    ui->lab_mL->setStyleSheet(style_release);
    ui->lab_mM->setStyleSheet(style_release);
    ui->lab_mM_up->setStyleSheet(style_release);
    ui->lab_mM_down->setStyleSheet(style_release);
}


void MainWindow::keyPressEvent(QKeyEvent *event)
{//键盘事件
    qDebug() << "=== press key";
    int keyValue = event->key();
    if (keyValue == Qt::Key_Control) //ctrl键
    {//获取鼠标位置
        QPoint pt = QCursor::pos(); //获取鼠标的绝对位置,即使是鼠标在屏幕外面,也能获取鼠标位置
        QString str;
        str = QString("%1 , %2").arg(pt.x()).arg(pt.y());
        ui->abs_edit->setText(str);//显示
    }

}

效果如下

在这里插入图片描述

PyQt中可以使用以下三个方法来处理鼠标左键中键右键事件: 1. `mousePressEvent(event)`:当用户按下鼠标按钮时调用此方法,可以通过 `event.button()` 方法来判断鼠标的哪个按钮被按下。 2. `mouseReleaseEvent(event)`:当用户释放鼠标按钮时调用此方法,可以通过 `event.button()` 方法来判断鼠标的哪个按钮被释放。 3. `mouseDoubleClickEvent(event)`:当用户双击鼠标按钮时调用此方法,可以通过 `event.button()` 方法来判断鼠标的哪个按钮被双击。 下面是一个简单的示例程序,演示如何处理鼠标左键中键右键事件: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget class MouseDemo(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Mouse Demo') self.show() def mousePressEvent(self, event): if event.button() == 1: print('Left button pressed') elif event.button() == 2: print('Middle button pressed') elif event.button() == 4: print('Right button pressed') def mouseReleaseEvent(self, event): if event.button() == 1: print('Left button released') elif event.button() == 2: print('Middle button released') elif event.button() == 4: print('Right button released') def mouseDoubleClickEvent(self, event): if event.button() == 1: print('Left button double clicked') elif event.button() == 2: print('Middle button double clicked') elif event.button() == 4: print('Right button double clicked') if __name__ == '__main__': app = QApplication(sys.argv) ex = MouseDemo() sys.exit(app.exec_()) ``` 在这个示例程序中,我们创建了一个 `MouseDemo` 类,继承自 `QWidget` 类。在 `initUI()` 方法中设置了窗口的初始大小和标题,并且显示出来。 然后我们重载了三个方法来处理鼠标左键中键右键事件。在 `mousePressEvent()` 方法中,我们使用 `event.button()` 方法来判断鼠标的哪个按钮被按下。在 `mouseReleaseEvent()` 方法中,我们使用 `event.button()` 方法来判断鼠标的哪个按钮被释放。在 `mouseDoubleClickEvent()` 方法中,我们使用 `event.button()` 方法来判断鼠标的哪个按钮被双击。 最后,我们使用 `QApplication` 类创建了一个应用程序对象,并将 `MouseDemo` 类的实例作为主窗口。最后调用 `sys.exit(app.exec_())` 来运行应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的小熊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值