QT中的事件

目录

1、QT事件

1.1、事件介绍

1.2、事件的处理

2、键盘事件

2.1、keyPressEvent

2.1.1、判断某个键按下

 2.1.2、组合键操作

3、鼠标事件

3.1、鼠标单击事件

3.2、鼠标释放事件

3.3、鼠标双击事件

3.4、鼠标移动事件

3.5、滚轮事件

4、事件过滤器

4.1、事件过滤器使用

5、定时器

5.1、QTimerEvent定时器实现

5.2、QTimer定时器实现

6、随机数种子

7、拖拽事件

拓(设置右键菜单栏):


1、QT事件

1.1、事件介绍

        事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。在Qt中使用一个对象来表示一个事件,它继承自QEvent类。

常见事件:鼠标事件、键盘事件、定时事件、上下文菜单事件、关闭事件、拖放事件、绘制事件。

1.2、事件的处理

重载相关的Event函数

重新实现事件的paintEvent(),mousePressEvent()等事件处理函数。这是最常用也的一种方法,不过它只能用来处理特定部件的特定事件。例如实现拖放操作,就是用的这种方法。

安装事件过滤器

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

2、键盘事件

QKeyEvent

QKeyEvent类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输入焦点的部件。

在Qt助手中,查找一下Qt::Key。

例:Qt::Key_Escape表示空格,Qt::Key_Left←键等等

2.1、keyPressEvent

        这个是需要包含头文件才能用,下面是从头文件中拿出来的

protected:    
    bool event(QEvent *event) Q_DECL_OVERRIDE;    
    virtual void mousePressEvent(QMouseEvent *event);//鼠标按下    
    virtual void mouseReleaseEvent(QMouseEvent *event);//鼠标释放    
    virtual void mouseDoubleClickEvent(QMouseEvent *event);//鼠标双击    
    virtual void mouseMoveEvent(QMouseEvent *event);//鼠标移动
#ifndef QT_NO_WHEELEVENT    
    virtual void wheelEvent(QWheelEvent *event); //滚轮
#endif    
    virtual void keyPressEvent(QKeyEvent *event);//按键按下    
    virtual void keyReleaseEvent(QKeyEvent *event);//按键释放    
    virtual void enterEvent(QEvent *event);//进入    
    virtual void leaveEvent(QEvent *event);//离开    
    virtual void paintEvent(QPaintEvent *event);//绘制    
    virtual void moveEvent(QMoveEvent *event);//离开

         这里父类是怎么定义的虚函数,和声明的我们就怎么实现它

//自己的类中去定义,然后实现
protected:
virtual void keyPressEvent(QKeyEvent *event);//按键按下

2.1.1、判断某个键按下

void Widget::keyPressEvent(QKeyEvent *event){    
    if(event->key()==Qt::Key_X)   {        
    qDebug()<<"X按下";   
    }
}

 2.1.2、组合键操作

        在Qt助手中搜索Qt::KeyboardModifier,如下 

void Widget::keyPressEvent(QKeyEvent *event){    
    if(event->modifiers()==Qt::ControlModifier)//判断是不是ctrl按下
    {        
        if(event->key()==Qt::Key_X)//接着判断是不是x按下
        {            
            qDebug()<<"ctrl+X";       
        }   
    }else if(event->key()==Qt::Key_X)   
    {        qDebug()<<"X按下";   
    }
}

3、鼠标事件

        QMouseEvent类用来表示一个鼠标事件,当在窗口部件中按下鼠标或者移动鼠标指针时,都会产生鼠标事件。利用QMouseEvent类可以获知鼠标是哪个键按下了,还有鼠标指针的当前位置等信息。通常是重定义部件的鼠标事件处理函数来进行一些自定义的操作。  

        QWheelEvent类用来表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向和距离。在滚轮事件处理函数中,使用QWheelEvent类的delta()函数获取了滚轮移动的距离,每当滚轮旋转一下,默认的是15度,当滚轮向远离使用者的方向旋转时,返回正值;当向着靠近使用者的方向旋转时,返回负值。这样便可以利用这个函数的返回值来判断滚轮的移动方向。

3.1、鼠标单击事件

Qt::LeftButton  左
Qt::RightButton 右
Qt::MidButton   中
void Widget::mousePressEvent(QMouseEvent *event){    
    if(event->button()==Qt::LeftButton)   {        
    qDebug()<<"左键按下";   
    }
}

3.2、鼠标释放事件

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

3.3、鼠标双击事件

void Widget::mouseDoubleClickEvent(QMouseEvent *event){    
    if(event->button()==Qt::LeftButton)   {        
        qDebug()<<"左键双击";   
    }
}

3.4、鼠标移动事件

        setMouseTracking(true); 这个默认是为false,需要设置为true,这样才能实时获取鼠标位置,要不然只有在按下的时候才能获取到

void Widget::mouseMoveEvent(QMouseEvent *event)
{    
    qDebug()<<event->x()<<event->y();    
    qDebug()<<event->pos();//相对于窗口的坐标    
    qDebug()<<event->globalPos();//相对于屏幕的坐标
}

3.5、滚轮事件

void Widget::wheelEvent(QWheelEvent *event){    
    static int x=0;    
    x+=event->delta();//还是±120    
    if(event->delta()>0)   
    {        
        qDebug()<<"滚轮往前"<<x;   
    }else{        
        qDebug()<<"滚轮往后"<<x;   
    }
}

4、事件过滤器

         有事件产生,在这个控件上只处理什么事件

         例如:在某个对话框输入任意信息但是是不会被输入到里面,会被获取

4.1、事件过滤器使用

//1、安装过滤器
ui->textEdit->installEventFilter(this);
//2、实现过滤器
//2.1、先声明函数
protected:
    virtual bool eventFilter(QObject *watched, QEvent *event);
//2.2、重写函数
bool Widget::eventFilter(QObject *watched, QEvent *event){
    if(watched == ui->textEdit){//2.2.1、设置你需要监听的部件
        if(event->type() == QEvent::KeyPress){//2.2.2、如果为键盘上按下的某个按键
            //测试效果
            QKeyEvent *keyen = static_cast<QKeyEvent*>(event);
            qDebug() << keyen->key();//输出按键的键值
            return true;
        }else{
            return false;
        }
    }
    return Widget::eventFilter(watched,event);//这个函数需要一直在监视所以这里是一个递归
}

 效果展示:

         这里不难看出,该部件已经将按键按下的时间捕捉到,这种情况可以参考某登录见面禁止复制粘贴很类似,但是输入法没有屏蔽掉。如果是其他的控件,也是同样的做法。

5、定时器

        定时器分为QTimerEvent和QTimer这2个类

        QTimerEvent类用来描述一个定时器事件。对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval )函数来开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回一个整型编号来代表这个定时器。当定时器溢出时就可以在timerEvent()函数中获取该定时器的编号来进行相关操作。  

        QTimer类来实现一个定时器,它提供了更高层次的编程接口,比如可以使用信号和槽,还可以设置只运行一次的定时器。 

5.1、QTimerEvent定时器实现

1、设置定时器
private: 
    int id1;    
    int c;//看效果的
2、设置时间
    c = 1;
    id1=startTimer(c);//1毫秒
3、函数实现
protected:
    virtual void timerEvent(QTimerEvent *event);

void Widget::timerEvent(QTimerEvent *event){
    if(event->timerId() == id1){
        qDebug()<<id1;
        c+=1;
        id1 = startTimer(c);
    }
}
    

效果展示

 5.2、QTimer定时器实现

//1、设置定时器
private:
    QTimer t1;    
    QTimer t2;

//2、设置时间
    t1.start(1000);//1000毫秒    
    t2.start(2000);

/*3、关联信号和槽
    槽函数,指的是这个时间到了要执行什么函数
*/
private slots:    
    void qDebugSlot1();    
    void qDebugSlot2();
void Widget::qDebugSlot1(){    
    qDebug()<<"t1";
}
void Widget::qDebugSlot2(){    
    qDebug()<<"t2";
}
connect(&t1,SIGNAL(timeout()),this,SLOT(qDebugSlot1()));   connect(&t2,SIGNAL(timeout()),this,SLOT(qDebugSlot2()));

6、随机数种子

         在使用qrand()函数产生随机数之前,一般要使用qsrand()函数为其设置初值,如果不设置初值,那么每次运行程序,qrand()都会产生相同的一组随机数。为了每次运行程序时,都可以产生不同的随机数,我们要使用qsrand()设置一个不同的初值。

qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//设置随机数种子
int rand = qrand() % 300;//获取随机数

7、拖拽事件

         就是可以直接拖放文件到程序中打开。

        例:拖入一个文本到程序中,把这个文本里面的内容都获取到程序上

包含头文件,用的wideget窗口
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>

1、函数声明:
protected:
    virtual void dragEnterEvent(QDragEnterEvent *event); //拖拽事件
    virtual void dropEvent(QDropEvent *event);//放下事件
2、函数实现
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
    //判断小部件上有没有事件
    if(event->mimeData()->hasUrls())
    {
        event->acceptProposedAction();  //事件给过去
    }else{
        event->ignore(); //忽略
    }
}

void Widget::dropEvent(QDropEvent *event)
{
    const QMimeData*mimeData=event->mimeData();
    if(!mimeData->hasUrls()){return;}
    QList<QUrl> urlList=mimeData->urls();//有多少个文件被拖过来
    for(int i=0;i<urlList.size();i++)//遍历
    {
        qDebug()<<urlList.at(i).toLocalFile();
    }
    QFile file(urlList.at(0).toLocalFile());//获取第一个文件的内容
    file.open(QIODevice::ReadOnly);
    QByteArray ba;
    ba=file.readAll();
    ui->textEdit_2->setPlainText(QString::fromLocal8Bit(ba));
}

3、接受事件
this->setAcceptDrops(true); //接受拖拽事件   
这个指的是窗口的,在这个窗口上面有一个多行纯文本控件

效果展示 

拓(设置右键菜单栏):

1、定义成员变量
private:
    QMenu *popMenu;               //右键弹出式菜单
    QAction *adjustTimeAction;    //右键弹出式菜单中的内容 调整功能1
    QAction *adjustDateAction;    //功能2
    QAction *quitAction;          //退出

2、函数声明
protected:
    virtual void contextMenuEvent(QContextMenuEvent *event);

3、函数实现
void Widget::contextMenuEvent(QContextMenuEvent *event){    //右键会触发这个事件
            popMenu->clear();
            popMenu->addAction(adjustTimeAction);
            popMenu->addAction(adjustDateAction);
            popMenu->addSeparator();//添加线

            popMenu->addAction(quitAction);
            //popMenu->exec(); //堵住
            popMenu->exec(QCursor::pos());
}

4、关联信号与槽以及设置(在ui->setupUi(this);之后)
    popMenu = new QMenu(this);
    popMenu->setStyleSheet(QStringLiteral("background-color: rgb(99, 99, 99);"));
    adjustTimeAction = new QAction(this);
    adjustTimeAction->setText(("功能1"));
    adjustDateAction = new QAction(this);
    adjustDateAction->setText(("功能2"));
    quitAction = new QAction(this);
    quitAction->setText(("退出"));
    connect(quitAction, SIGNAL(triggered(bool)),this, SLOT(close()));//关联退出的Action
    

 

 

  • 13
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

small建攻

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

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

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

打赏作者

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

抵扣说明:

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

余额充值