Qt 窗口鼠标消息处理

2023-10-20 17:42:18 浏览数 (2)

在继承了 QWidget 窗口类以后,我们可以实现很多父类提供的虚函数,其中就包括鼠标的诸多消息处理函数,比如 mousePressEvent(鼠标单击消息)、mouseReleaseEvent(鼠标弹起消息)等等,这些虚函数我们可以通过 Qt 的帮助文档查看,如下:

只要你重写这些提供的虚函数,就可以捕获对应的消息,下面我们做了一些鼠标消息的小例子,借这些例子,你也可以覆写一些键盘等方面的消息处理虚函数。 【实现代码】 代码分三个文件,分别为(参考 使用 Qt 构建一个简单的窗体程序 ):

  • main.c:创建应用程序框架,调用 CWidget 窗口的入口函数。
  • CWidget.h:继承 QWidget 类。
  • CWidget.cpp:覆写鼠标等消息函数的实现
代码语言:javascript复制
#include 
#include “cwidget.h”
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
CWidget w;
w.show();

return app.exec();
}
#ifndef CWIDGET_H
#define CWIDGET_H
#include 
#include 
#include 
class CWidget : public QWidget
{
    Q_OBJECT
public:
    explicit CWidget(QWidget *parent = 0);
// 鼠标按下消息
void mousePressEvent(QMouseEvent *);
// 鼠标松开消息
void mouseReleaseEvent(QMouseEvent *);
// 鼠标双击消息,有bug,会产生一次 mousePressEvent
void mouseDoubleClickEvent(QMouseEvent *);
// 鼠标移动消息,默认要在触发了mousePressEvent后才生效
// 需要在构造函数中调用 this->setAttribute(Qt::WA_MouseTracking);
void mouseMoveEvent(QMouseEvent *);

// 鼠标进入窗口范围内消息
void enterEvent(QEvent *);
// 鼠标离开窗口范围内消息
void leaveEvent(QEvent *);
signals:
public slots:
};
#endif // CWIDGET_H
#include “cwidget.h”
CWidget::CWidget(QWidget *parent) : QWidget(parent)
{
    this->setAttribute(Qt::WA_MouseTracking);
}
void CWidget::mousePressEvent(QMouseEvent *ev)
{
    // 鼠标左键单击
    if (ev->button() == Qt::LeftButton)
    {
        qDebug() << “left button down…”;
    }
    // 鼠标右键单击
    else if (ev->button() == Qt::RightButton)
    {
        qDebug() << “right button down…”;
    }
// 判断是否按下了 alt 键
if (ev->modifiers() == Qt::AltModifier)
{
    qDebug() << "alt is down...";
}
// 判断是否按下了 CTRL 键
if (ev->modifiers() == Qt::CTRL)
{
    qDebug() << "ctrl is down...";
}
}
void CWidget::mouseReleaseEvent(QMouseEvent *ev)
{
    // 鼠标左键单击弹起
    if (ev->button() == Qt::LeftButton)
    {
        qDebug() << “left button up…”;
    }
    // 鼠标右键单击弹起
    else if (ev->button() == Qt::RightButton)
    {
        qDebug() << “right button up…”;
    }
}
void CWidget::mouseDoubleClickEvent(QMouseEvent *)
{
    // 双击消息,会产生一次 mousePressEvent
    qDebug() << “doubleClick…”;
}
void CWidget::mouseMoveEvent(QMouseEvent *)
{
    // 鼠标移动
    qDebug() << “mouse move…”;
}
void CWidget::enterEvent(QEvent *)
{
    qDebug() << “mouse enter…”;
}
void CWidget::leaveEvent(QEvent *)
{
    qDebug() << “mouse leave…”;
}

0 人点赞