QT基础篇(11)QT5事件处理及实例

1.鼠标事件及实例

QT5中有多种鼠标事件可以使用,常用的鼠标事件有:

  1. mousePressEvent:当鼠标按下时触发的事件。
  2. mouseReleaseEvent:当鼠标释放时触发的事件。
  3. mouseDoubleClickEvent:当鼠标双击时触发的事件。
  4. mouseMoveEvent:当鼠标移动时触发的事件。
  5. wheelEvent:当鼠标滚轮滚动时触发的事件。

下面是一个简单的例子,演示了如何使用鼠标事件:

#include <QtWidgets>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::LeftButton)
        {
            qDebug() << "Left button pressed";
        }
        else if (event->button() == Qt::RightButton)
        {
            qDebug() << "Right button pressed";
        }

        // 必须调用基类的函数,以确保其他事件处理程序可以接收到事件
        QWidget::mousePressEvent(event);
    }

    void mouseReleaseEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::LeftButton)
        {
            qDebug() << "Left button released";
        }
        else if (event->button() == Qt::RightButton)
        {
            qDebug() << "Right button released";
        }

        QWidget::mouseReleaseEvent(event);
    }

    void mouseDoubleClickEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::LeftButton)
        {
            qDebug() << "Left button double clicked";
        }
        else if (event->button() == Qt::RightButton)
        {
            qDebug() << "Right button double clicked";
        }

        QWidget::mouseDoubleClickEvent(event);
    }

    void mouseMoveEvent(QMouseEvent *event) override
    {
        qDebug() << "Mouse moved to" << event->pos();

        QWidget::mouseMoveEvent(event);
    }

    void wheelEvent(QWheelEvent *event) override
    {
        if (event->angleDelta().y() > 0)
        {
            qDebug() << "Mouse wheel scrolled up";
        }
        else if (event->angleDelta().y() < 0)
        {
            qDebug() << "Mouse wheel scrolled down";
        }

        QWidget::wheelEvent(event);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}

在这个例子中,我们创建了一个自定义的MyWidget类,并重写了上述的鼠标事件处理函数。在每个函数中,我们使用qDebug()函数输出一些信息,以便在控制台中查看这些事件。

注意,在每个事件处理函数中,我们都调用了基类的对应函数,这是为了保证其他事件处理程序可以继续接收到事件。

main()函数中,我们创建了一个MyWidget对象并显示它,然后通过调用app.exec()进入事件循环,以接收和处理鼠标事件。

当运行这个程序时,你可以在控制台中看到与鼠标相关的事件信息。你可以尝试按下、释放、双击鼠标按钮,移动鼠标和滚动鼠标滚轮,并观察输出结果。

2.键盘事件及实例

在QT5中,可以使用键盘事件来响应键盘的按下和释放动作。常用的键盘事件有:

  1. keyPressEvent:当键盘按键被按下时触发的事件。
  2. keyReleaseEvent:当键盘按键被释放时触发的事件。

下面是一个简单的例子,演示了如何使用键盘事件:

#include <QtWidgets>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}

protected:
    void keyPressEvent(QKeyEvent *event) override
    {
        qDebug() << "Key" << event->text() << "pressed";

        QWidget::keyPressEvent(event);
    }

    void keyReleaseEvent(QKeyEvent *event) override
    {
        qDebug() << "Key" << event->text() << "released";

        QWidget::keyReleaseEvent(event);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}

在这个例子中,我们创建了一个自定义的MyWidget类,并重写了keyPressEventkeyReleaseEvent函数。在每个函数中,我们使用qDebug()函数输出键盘事件相关的信息。

注意,在每个事件处理函数中,我们都调用了基类的对应函数,这是为了保证其他事件处理程序可以继续接收到事件。

main()函数中,我们创建了一个MyWidget对象并显示它,然后通过调用app.exec()进入事件循环,以接收和处理键盘事件。

当运行这个程序时,你可以按下和释放键盘上的任何按键,并在控制台中看到与键盘事件相关的输出信息。

这只是一个简单的例子,你可以根据需要处理更复杂的键盘事件,例如处理特定的组合键或按键序列。

3.事件过滤及实例

在QT5中,事件过滤器(Event Filter)是一种机制,允许你在一个对象上监听和处理其他对象的事件,而不是直接在目标对象上重写事件处理函数。

使用事件过滤器的好处是可以在一个类中集中处理多个对象的事件,简化代码结构和管理。

下面是一个使用事件过滤器的示例:

#include <QtWidgets>

class EventFilter : public QObject
{
public:
    EventFilter(QObject *parent = nullptr) : QObject(parent) {}

protected:
    bool eventFilter(QObject *watched, QEvent *event) override
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            qDebug() << "Key" << keyEvent->text() << "pressed";
        }

        return QObject::eventFilter(watched, event);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton button("Press me");
    button.show();

    EventFilter filter;
    button.installEventFilter(&filter);

    return app.exec();
}

在这个例子中,我们创建了一个名为EventFilter的自定义类,继承自QObject。在EventFilter类中,我们重写了eventFilter函数,该函数会被框架自动调用来处理所有事件。

eventFilter函数中,我们判断事件的类型是否为按键事件(QEvent::KeyPress),如果是,我们将事件转换为QKeyEvent类型,然后输出按下的键。

main()函数中,我们创建了一个QPushButton对象,并显示它。然后,我们创建了一个EventFilter对象,并通过调用installEventFilter()函数将事件过滤器安装到按钮上。

这样,当按钮上发生任何事件时,都会触发EventFilter类中的eventFilter函数,以便处理事件。

在运行这个程序时,点击按钮或按下键盘上的按键,都会在控制台中看到相关的输出信息。

注意,事件过滤器所安装的对象,可以是任何继承自QObject的对象,不仅仅是QWidget或其派生类。你可以根据需要在不同的对象上使用事件过滤器。

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值