Qt常用事件汇总

28 篇文章 2 订阅

一个事件由一个特定的 QEvent 子类来表示,但是有时一个事件又包含多个事件类型,比如鼠标事件又可以分为鼠标按下、双击和移动等多种操作。这些事件类型都由 QEvent 类的枚举型 QEvent::Type 来表示,其中包含了 一百多种事件类型,可以在 QEvent 类的帮助文档中查看。虽然 QEvent 的子类可以表示一个事件,但是却不能用来处理事件,那么应该怎样来处理一个事件呢?在 QCoreApplication 类的notify()函数的帮助文档处给出了5种处理事件的方法:

方法一:重新实现部件的 paintEvent()、mousePressEvent() 等事件处理函数。这是最常用的一种方法,不过它只能用来处理特定部件的特定事件。

方法二:重新实现 notify() 函数。这个函数功能强大,提供了完全的控制,可以在事件过滤器得到事件之前就获得它们。但是,它一次只能处理一个事件。

方法三:向 QApplication 对象上安装事件过滤器。因为一个程序只有一个 QApplication 对象,所以这样实现的功能与使用 notify() 函数是相同的,优点是可以同时处理多个事件。

方法四:重新实现 event() 函数。QObject 类的 event() 函数可以在事件到达默认的事件处理函数之前获得该事件。

方法五:在对象上安装事件过滤器。使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。

在实际编程中,最常用的是方法一,其次是方法五。因为方法二需要继承自 QApplication 类;而方法三要使用一个全局的事件过滤器,这将减缓事件的传递,所以,虽然这两种方法功能很强大,但是却很少被用到。

------>>>>>>鼠标单击 移动 释放 与滚动事件
#include<QMouseEvent>
#include<QWheelEvent>

protected:
    void wheelEvent(QWheelEvent *e);
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);

void wheelEvent(QWheelEvent *e)
{
    if (e->delta() > 0) //鼠标向上滚动
    {
        ui->textEdit->zoomIn(); //进行放大,textEdit的光标和字体都放大
    }
    else
    {
        ui->textEdit-zoomOut(); //进行缩小,textEdit的光标和字体都缩小
    }
}

void mousePressEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton)
    {
        qDebug() << "左键按下";
    }
    else if (e->button() == Qt::RightButton)
    {
        qDebug() << "右键按下";
    }
    
      qDebug() << "Press:" << event->x() << " " << event->y();
}

//只有鼠标按下后移动鼠标才会产生mouseMove事件
void mouseMoveEvent(QMouseEvent *e)
{
        if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左键移动" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右键移动" ;
    }

    //获取移动过程中的鼠标指针坐标
    qDebug() << "move:" << event->x() << " " << event->y();
}

void mouseReleaseEvent(QMouseEvent *e)
{
        if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左键释放" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右键释放" ;
    }

    //获取释放时的鼠标指针坐标
    qDebug() << "release:" << event->x() << " " << event->y();
}

----->>>>>>拖拽事件
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QUrl>

protected:
    void dragEnterEvent(QDragEnterEvent *e);
    void dropEvent(QdropEvent *e);


this->setAcceptDrops(true); //接收拖拽事件

void dragEnterEvent(QDragEnterEvent *e)
{
    if (e->mineData()->hasUrls())
        e->acceptProsedAction();
    else
        e->ignore();
}    

void dropEvent(QdropEvent *e)
{
    const QMimeData *mimeData = event->mimeData(); //获取MIME数据
    if (mimeData->hasUrls()){
        QList<QUrl> urlList = mimeData->urls(); //获取url列表
        QString fileName = urlList.at(0).toLocalFile();
        if (!fileName.isEmpty()){
            QFile file(fileName);
            if(!file.open(QIODevice::ReadOnly))
                return
                
            QTextStream in(&file);
            ui->textEdit()->setText(in.readAll());        
        }
    }
}
----->>>>>>键盘事件
#include <QKeyEvent>

protected:
    void keyPressEvent(QkeyEvent *e);
    void keyReleaseEvent(QKeyEvent *e);

void keyPressEvent(QkeyEvent *e)
{
    switch(e->key())
    {
    case Qt::key_Escape:
        qDebug() << "Esc";
        break;
    case Qt::key_Return
        qDebug() << "Enter";
        break;
    default:
        break;    
    }
    
    
    if (e->modifiers() == Qt::ControlModifier)
    {
        //如果是,那么再检测M键是否按下
        if(event->key() == Qt::Key_M)
        {
            //按下则使窗口最大化
            this->setWindowState(Qt::WindowMaximized);
        }
    }
}

void keyReleaseEvent(QKeyEvent *e)
{
    if (e->key() == Qt::keyUp)
    {
        qDebug() << "Release: " << "Up";
    }
}
----->>>>>>定时器事件
如果想让定时器仅仅执行一次, 可以使用 setSingleShot(bool singleShot);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
timer->setSingleShot(true);
timer->start(2000);

自定义非阻塞的延时功能
QCoreApplication::processEvents();
QEventLoop loop;//定义一个新的事件循环
QTimer::singleShot(2000, &loop, SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数
loop.exec();

protected:
    void timerEvent(QTimerEvent *e);

id1 = startTimer(1000); 
id2 = startTimer(2000);
id3 = startTimer(3000);    
void timerEvent(QTimerEvent *e)
{
    if (e->timerId() == id1)
    {
        qDebug() << "定时器1超时"
    }
    else if (e->timerId() == id2)
    {
        qDebug() << "定时器2超时"
    }
    else if (e->timerId() == id3)
    {
        qDebug() << "定时器3超时"
    }
}

主动发送事件函数:sendEvent()与PostEvent()
sendEvent()立即处理给定的事件, 不需要放入事件队列中,其QEvent对象参数在事件发送完成后无法自动删除,故需要在栈上创建QEvent对象
postEvent()将事件放入等待调度队列中,等待下一次事件循环处理,其QEvent对象参数在事件发送后队列会自动删除,故需要在堆上创建QEvent对象


    

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT是一种流行的跨平台软件开发框架。QT 5.9.9是QT的一个版本,它包含了许多不同类型的组件,这些组件可以用于各种不同的软件开发项目。 下面是QT 5.9.9中常用的组件汇总: 1. Qt Core:Qt Core是QT的基础模块,包括了QT的核心类和功能,用于处理各种不同类型的数据和操作。 2. Qt GUI:Qt GUI提供了QT图形界面(GUI)开发的基本功能。您可以使用这些功能来创建按钮、进度条、对话框、菜单等各种视觉效果。 3. Qt Widgets:Qt Widgets是QT的GUI库,提供了许多常见的窗口部件,例如按钮、文本框和标签等。 4. Qt Network:Qt Network是一个用于处理网络通信的模块。它包括了许多不同的类,可以帮助您建立和管理网络连接,发送和接收网络数据。 5. Qt SQL:Qt SQL是一个用于处理数据库的模块。它支持许多不同的数据库管理系统,例如MySQL、SQLite和Oracle等。 6. Qt Multimedia:Qt Multimedia是QT的多媒体框架,可以帮助您处理声音、视频等多媒体数据。 7. Qt QML:Qt QML是一种基于JavaScript的语言,用于创建高性能、符合人类直觉的用户界面。它支持许多不同的平台,包括移动设备和桌面电脑。 8. Qt Quick:Qt Quick是QT中用于创建动态、流畅的用户界面的模块。它基于QML语言,并且可以与Qt Widgets和Qt OpenGL集成使用。 总之,QT 5.9.9中有许多常用组件,可以帮助开发人员快速、轻松地开发出各种高性能、优秀的软件应用。无论您是在开发桌面应用程序、移动应用程序或Web应用程序,QT都提供了各种不同的模块和组件,可以满足您的需求。 ### 回答2: Qt5.9.9是一款常用的跨平台C++程序开发框架,它集成了许多常用的组件,以下是其中的一些: 1. 控件组件:Qt5.9.9中包含了许多界面控件,如按钮、文本框、标签、进度条等,可以方便地在图形化界面中使用。 2. 视图组件:Qt5.9.9中的视图组件包括ListView、TreeView、TableView等,它们可以用于显示和编辑列表和表格等结构化数据。 3. 窗口组件:Qt5.9.9支持窗口组件,如QWidget、QMainWindow等,可以创建多级窗口来实现复杂的界面设计。 4. 图形组件:Qt5.9.9中的图形组件可以用于绘制2D和3D的图形,如QPainter、QGraphicsView、QOpenGLWidget等。 5. 多媒体组件:Qt5.9.9支持音频、视频、图像等多种媒体格式的处理和播放,如QMediaPlayer、QVideoWidget、QSound等。 6. 网络组件:Qt5.9.9中的网络组件可用于编写基于TCP和UDP协议的网络应用程序,如QTcpSocket、QUdpSocket等。 7. 数据库组件:Qt5.9.9可以与MySQL、SQLite、ODBC等多种数据库进行交互,使用QSqlDatabase、QSqlTableModel等组件。 8. 文件和IO组件:Qt5.9.9中的文件和IO组件用于访问和操纵文件系统,如QFile、QDir、QTextStream等。 以上就是Qt5.9.9中常用的组件汇总,这些组件可以帮助开发人员更快地开发出高效、易用、美观的跨平台应用程序。 ### 回答3: Qt是一个跨平台的应用程序开发框架,它提供了丰富的工具来创建现代化的用户界面和强力的应用程序功能。其中,Qt5.9.9是Qt框架的一个版本,它包含了数百个不同的组件来满足不同应用程序的需求。以下是Qt5.9.9中一些常用的组件的汇总: 1. QWidget:这是Qt的一个基本组件,它提供了一个可视化界面来创建自定义窗口、按钮、标签、文本框等等。 2. Qt GUI:这是Qt中最重要的组件,它包含了大量的小部件、布局、绘图、事件处理和窗口管理工具。通过Qt GUI,开发人员可以轻松创建各种现代化的、有效的用户界面。 3. Qt Core:这个组件包含了Qt的核心功能,提供了字符串操作、文件操作、日期和时间函数、对象模型和信号槽机制等等。 4. Qt SQL:这个组件提供了访问关系型数据库的能力,支持多种数据库系统,如MySQL、PostgreSQL、SQLite等等。 5. Qt Multimedia:这个组件提供了音频和视频处理功能,支持各种格式的音频和视频文件。 6. Qt Network:这个组件提供了网络编程功能,支持TCP、UDP和SSL协议,通过HTTP和FTP访问网络资源,进行网络传输。 7. Qt Widgets:这个组件提供了一系列现代化的小部件和窗口样式,使图形用户界面更加美观、简单、直观。 除此之外,Qt还提供了许多其他的组件,例如Qt Quick、Qt WebEngine、Qt Bluetooth、Qt WebSockets等等,它们都可以帮助开发人员创建更加完整、强大、可靠的应用程序。无论您是初学者还是经验丰富的开发人员,Qt都是一款强大而易用的框架,值得您的学习和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值