• 【QT知识】在widget中的绘制事件函数


    在widget中的绘制事件函数


    😊点此到文末惊喜↩︎

    1. 代码实现

    头文件部分

    #include 
    #include 
    
    namespace Ui {
    class widget_2_1;
    }
    
    class widget_2_1 : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit widget_2_1(QWidget *parent = nullptr);
        ~widget_2_1();
        void resizeEvent(QResizeEvent *event);
        bool eventFilter(QObject *obj, QEvent *event);
        void paintEvent(QPaintEvent *);
    
    private:
        //void set_wg2_1_background();
    protected:
            Ui::widget_2_1 *ui;
    protected:
        void keyPressEvent(QKeyEvent *event);
    
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    cpp文件部分

    
    // 绘制事件实现widget上绘制一条直线
    void widget_2_1::paintEvent(QPaintEvent *)
    {
        QPainter painter(this); // 这个this很重要
        painter.drawLine(80, 100, 650, 500);
    }
    bool widget_2_1::eventFilter(QObject *obj, QEvent *event)
    {
    
    	//1.在构造函数中,调用 installEventFilter()注册监视对象
    	/*例子:
    	zoomCheckBox->installEventFilter(this);
    	*/
        
    	//2.在监视对象的eventFilter()函数中处理目标对象的事件。
    		//如果对象是zoomCheckBox,当鼠标进入(悬停)其上,则zoomTips显示
        if (obj == (QObject*)ui->zoomCheckBox)
        {
            if (event->type() == QEvent::Enter)
            {
                ui->zoomTips->setVisible(true);
            }
            else if(event->type() == QEvent::Leave)
            {
                ui->zoomTips->setVisible(false);
            }
            return false;
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2. 事件函数

    1. void resizeEvent(QResizeEvent *event);
      • 作用:导致窗口发生大小变化或绘制变化的事件产生时会被调用,进行相应的重写和控件调整,避免错误的显示
      • 触发paintEvent事件
        • 窗口大小(重新调整)改变,或者重新排布(布局)导致重画
        • 调用update 或者 repaint重画
        • 当窗口第一次显示时,系统会自动产生绘图事件
        • 当窗口部件被其他部件遮挡时,然后又再次显示出来,会对隐藏区域进行重绘事件
    2. bool eventFilter(QObject *obj, QEvent *event);
      • 作用:事件过滤器,将原本应该直接发送给组件对象的事件,先发送给过滤器对象,经过过滤后再发送给组件对象
      • 实例如上,控件在构造函数中注册,在该事件过滤器函数中处理注册的控件的消息
    3. void paintEvent(QPaintEvent *);// 绘制事件
      • 作用:用来重绘一个部件的全部或者部分区域
      • 重绘事件的触发:
        • repaint()函数或者update()函数被调用
        • 被隐藏的部件现在被重新显示
        • 其他原因
      • 绘制的优化
        • 当update()函数被调用多次,或者窗口系统发送了多个重绘事件,那么Qt就会合并这些事件成为一个事件。可能多个事件只调用一次绘制函数
        • update()函数允许Qt优化速度和减少闪烁,但是repaint()函数不支持这样的优化,所以建议一般情况下尽可能使用update()函数。
        • 在程序开始运行时就会自动发送重绘事件而调用paintEvent()函数
        • 不要在paintEvent()函数中调用update()或者repaint()函数
        • 当重绘事件发生时,要更新的区域一般会被擦除,然后在部件的背景上进行绘制


    少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
    秘籍(点击图中书籍)·有缘·赠予你


    🚩点此跳转到首行↩︎

    参考博客

    1. resizeEvent , paintEvent事件触发原因
    2. Qt 事件过滤器 - EventFilter
    3. QT关键问题解决之paintevent理解
    4. 待定引用
  • 相关阅读:
    浅学 RabbitMQ
    支持注册API类型
    Linux+qt:创建动态库so,以及如何使用(详细步骤)
    Spring 04: IOC控制反转 + DI依赖注入
    解锁机器人技术的钥匙—《应用机器人学:运动学、动力学与控制技术》
    LeetCode第1题:两数之和
    【02】数据类型-数据变量
    基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成
    stm32之freeRTOS驱动小车
    Netty入门——Handler & Pipeline
  • 原文地址:https://blog.csdn.net/qq_43840665/article/details/127923588