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

这篇具有很好参考价值的文章主要介绍了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或其派生类。你可以根据需要在不同的对象上使用事件过滤器。文章来源地址https://www.toymoban.com/news/detail-806379.html

到了这里,关于QT基础篇(11)QT5事件处理及实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt5开发及实例V2.0-第七章-Qt图形视图框架

    7.1.1 Graphics View的特点 Graphics View框架结构的主要特点如下。 (1)Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL工具来改善绘图性能。 (2)Graphics View支持事件传播体系结构,可以使图元在场景(scene)中的交互能力提高1倍,图元能够处理键盘事件和鼠标事

    2024年02月07日
    浏览(48)
  • Qt5开发及实例V2.0-第四章Qt基本对话框

    首先介绍标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框(QFontDialog)、标准输入对话框(QInputDialog)及标准消息对话框(QMessageBox),运行效果如图4.1所示。 按如图4.1所示依次执行如下操作。 (1)单击“文件标准对话框实例”按钮,弹出“文

    2024年02月07日
    浏览(103)
  • Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130381428 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…   mysql驱动版本msvc2015x32版本调

    2023年04月26日
    浏览(78)
  • 【QT5:CAN卡通信的上位机-代码练习-收发数据+布局+引用外部库+基础样例(1)】

    有句话叫做,出来还混,早晚是要还得,当时为快点使用完成can的qt上位机,偶然在网上找到一个样例,正好能运行,就直接拿着那个样例进行改了,后来上位机遇到点精准时间问题,一时间不知道如何调,正好也借着这个机会,学习一下样例代码,纯手打一遍。 实验环境还

    2024年02月01日
    浏览(37)
  • QT基础篇(12)QT5多线程

    在任何一门语言中,多线程都是一个相对其他方面比较重要的点,这里面的知识体系很庞大,同步和异步之间的处理方式,以及IO多路复用等等各种进行性能优化的方面,在往上层一点我们不可能一直进行系统层次的调用,这样太费时间也太麻烦,就到设计模式这里,比如反

    2024年01月22日
    浏览(38)
  • QT基础篇(10)QT5网络与通信

    QT5网络与通信是指在QT5开发环境中使用网络进行数据传输和通信的相关功能和技术。 QT5提供了一套完善的网络模块,包括了TCP、UDP、HTTP等协议的支持,可以方便地在QT应用程序中进行网络通信。通过QT5的网络模块,开发者可以实现客户端和服务器之间的数据传输、消息推送、

    2024年01月19日
    浏览(38)
  • QT基础篇(16)QT5单元测试框架

    1.QTEstLib框架 QTestLib框架是一个用于软件测试的开源框架,是Qt工具套件的一部分。它提供了一组用于编写自动化测试和单元测试的类和函数。 QTestLib可以方便地为Qt应用程序编写单元测试,包括测试GUI和非GUI的代码。它提供了一系列断言和辅助函数,用于验证测试的预期结果

    2024年01月25日
    浏览(39)
  • QT基础篇(15)QT5多国语言国际化

    1.基本概念 1.1国际化支持的实现 语言国际化(Localization)是指将软件、网站或应用程序适应不同语言、地区和文化的过程。实现语言国际化支持可以通过以下几个步骤: 提取可本地化的文本:将软件或应用程序中需要翻译的文本内容提取出来,例如界面文本、按钮标签、错

    2024年01月24日
    浏览(38)
  • 基于Qt数据库项目实现(Sqlite3为例)|考查数据库、绘制(画家)、事件等知识点(进阶)

    坚持最初的梦想,扬帆起航,乘风破浪,永不言败。 01 数据库 数据库是什么?简易言之,就是保存数据的文件。可以存储大量数据,包括插入数据、更新数据、截取数据等。用专业术语来说,数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计

    2024年02月19日
    浏览(45)
  • Windows+Qt5.14.2+android x86配置与处理adb报错

    资源下载 可在部分国内镜像源下载Qt5.14.2:Index of /qt/archive/qt/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 其他工具 android studio:下载 Android Studio 和应用工具 - Android 开发者  |  Android Developers sdk manager 、ndk、java 安装过程 根据qt5.14.2自助选择需要安装的anroid组件等、vs2

    2024年01月20日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包