QT中事件处理以及绘制图形

1、什么是事件

        事件就是某个事情的起因、经过、结果三部分组成一个事件。在QT中,将事件封装成一个类,当我们想要使用一个特定事件的时候,我们只需要把该类实例化成对象,之后使用该对象就是使用该对应的事件。比如QT中常见的类有:鼠标事件(QMouseEvent)、键盘事件(QKeyEvent)、定时器事件(QTimer)、以及图形事件。

2、事件的流程

        首先要产生事件、事件的派送、事件的分发、事件的处理,一共4个步骤。打个比方:“你拿100元分给你朋友们买零食吃”事件,产生事件(你拿100元分给你朋友们买零食吃),事件的派送(你需要把钱送到你朋友们那里去)、事件的分发(送到朋友那里之后,你就给每个朋友分一点)、事件的处理(最后你朋友们就拿着你分到的钱去买零食吃),这个列子可能举得不是很好,如果有更好的例子去理解,请发在评论区,我定向大佬们学习。QT的所有事件都是统归QEvent类管理。

        (1)、事件的产生:在QT中可以内部产生事件(定事件的时器事件),外部产生的事件(鼠标事件、键盘事件、拖动事件等等)。

        (2)、事件的派送:事件的派送都是通过QAPPlication类对事件进行派送的,调用该类里的exec()(模态显示)函数来进入事件的循环状态(监听事件)。

        (3)、事件的分发:QT提供一个QEvent类来进行事件的分发,使用QEvent类里的event()函数。

        (4)、事件的处理:比如QT常用的处理函数有keypressevent()、mousepressevent()等等。

3、QT中常用的事件处理函数(基于QWidget类),以下都是虚函数,如果要使用,则需要重写

        virtual void closeEvent(QCloseEvent * event):窗口关闭事件处理函数

        virtual void dragEnterEvent(QDragEnterEvent *event):拖动窗口进入另一个窗口事件处理函数

        virtual void dragMoveEvent(QDragMoveEvent *event):拖动窗口事件处理函数

        virtual void dragLeaveEvent(QDragLeaveEvent *event):拖动窗口离开另一个窗口事件处理函数 

        virtual void keypressEvent(QKeyEvnet * event):键盘按下事件处理函数

        virtual void mouseDoubleClickEvent(QMouseEvent *event):鼠标双击事件处理函数

        virtual void paintEvent(QPaintEvent *event):绘制图形事件处理函数

        virtual void timerEvent(QTimerEvent  *e) override:当开启定时器则触发该事件

4、内部事件(定时器)

        超时信号:void timeout()

        超时处理事件:

                QTimer *timer = new QTimer;   在堆区实例化对象

                超过该时间去处理的其他函数

                connect(timer,SIGNAL(timeroout()),this,SLOT(display())); //display()函数是当定时器定时到了就去执行的函数。

                timer->start(1000); //设置定时器定时为1S

        定时器事件虚函数:virtual void timerEvent(QTimerEvnet *e);

        开启定时器并设置定时时间:startTimer(1000);//开启1S的定时器

5、外部事件(鼠标事件、键盘事件)

        鼠标关闭窗口处理函数:virtual void closeEvent(QCloseEvent *event);

                ignore():忽略该关闭动作

                accept():接收该关闭动作

        鼠标按下事件处理函数:virtual void mousePressEvent(QMouseEvent *event)
                当鼠标按下的时候,触发该事件
                例如:
                void Dialog::mousePressEvent(QMouseEvent *event)
                {
                    //获取点击的坐标
                    qDebug()<<"鼠标点击的位置:"<pos()<                     qDebug()<<"x的坐标:"<x()<                     qDebug()<<"y的坐标:"<y()<                     Qt::MouseButton btn=event->button(); //获取鼠标点击的按钮(左击还是右击等等)
                    if(btn==Qt::LeftButton)
                    {
                        qDebug()<<"鼠标左键按下"<                         //按下需要处理的函数
                    }
                    if(btn==Qt::RightButton)
                    {
                        qDebug()<<"鼠标右键按下"<                     }
                    qDebug()<<"鼠标按下"<                 }

        键盘按下事件:virtual void KeyPressEvent(QKeyPressEvent * event)

6、事件过滤器(指定相应的事件通过,其他事件一律不过):bool QObject::eventFilter(QObject *watched,QEvent *event)

        注册事件过滤器:installWc=ventFilter(QWidget *widget);

7、事件分发器(QWidget类下的方法)

        如果用户重写了事件分发器,那么产生的事件就会派送给事件分发器,这些事件就在事件分发器中处理。

        virtual void QWidget::event(QEvent * event);

        类型转换函数:static_cast<目的类型>(源类型) //模板函数 :template void func();

8、图形事件

        用户在窗口绘制图形的时候会触发该图形事件,绘制图形的类为:QPainter类

        有两种情况会自动执行图形事件:

                (1)、在窗口初始化第一次显示的时候会执行图形事件

                (2)、在窗口刷新或者更新的时候会自动执行图形事件

        常用的图形绘制(实现每种图形绘制的方法很多,每个图形只举1函数)

                (1)、画点:绘制单个点:void drawPoint(int x,int y);

                                        绘制多个点:void drawPoints(const QPoint * points,int pointCount);

                (2)、画线:绘制单条线:void drawLine(int x1,int y1,int x2,int y2);

                                        绘制多条线:void drawLines(const QLine *lines, int lineCount);

                (3)、画圆:void drawEllipse(int x,int y,int width,int height);

                (4)、画矩形:void drawRect(int x,int y,int weight,int height);

                (5)、画扇形:void drawPie(int x, int y, int width, int height, int startAngle, int spanAngle);

                                startAngle:起始角度

                                 spanAngle:旋转角度

                (6)、画弧:void drawArc(int x, int y, int width, int height, int startAngle, int spanAngle);

                (7)、画弦:void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle);

       9、总结:在学习这节的时候,学得懵懵懂懂,要记的函数很多,但是这么多函数谁记得住呢,所以唯一的办法就是记住在哪一个类中,然后去QT帮助文档里查询相应的方法。如果以上有不对的地方请多多指教。

你可能感兴趣的:(QT,qt,开发语言,c++)