Qt实现窗口同比例放大/缩小

实现思路:

Qt中有resizeEvent事件,该事件当窗口大小改变时便会产生响应,所以可利用此来实现窗口同比例缩放问题,但是由于resizeEvent事件是随着窗口大小改变不断刷新的,因此在重写resizeEvent时,直接改变窗口大小,代码会产生冲突,无法决断该放大和缩小,因此为了判别resizeEvent事件结束,又重写了NonCientAreaMouseButtonRelease事件,该事件表示在非客户端区域鼠标键释放,(非客户区域概念可参考 https://blog.csdn.net/godqiao/article/details/78581883),鼠标左键释放,表示事件绘制完成,因此,便可以在此处实现更改窗口的大小的代码。

实现步骤:

在.h文件下声明

protected: 
   virtual bool event(QEvent *event);

在.cpp文件下

bool Classname::event(QEvent *event)
{
    if(event->type() == QEvent::NonClientAreaMouseButtonRelease)
    {
        update_size(); //调用绘制窗口大小的函数
        return true;  //返回true该事件在此处被处理后,不用传到父类
    }
    else if(event->type() == QEvent::Resize)
    {

        /*更新此时的页面宽度和长度*/        
        screen_width[0] = this->geometry().width();  
        screen_height[0] = this->geometry().height();
        return true;
    }
    else
    {

        return QWidget::event(event);
    }

}


void Classname::update__size()
{
     //设置一个大小为2的数组,一个用来存新值,一个用来存旧值,通过比较判断为页面放大操作还是缩小操作
     if(screen_height[0]>screen_height[1] || screen_width[0]>screen_width[1])
     {
        this->resize((screen_height[0]>screen_width[0]?screen_height[0]:screen_width[0])-10,(screen_height[0]>screen_width[0]?screen_height[0]:screen_width[0])-10);

     }
     if(screen_height[0]<screen_height[1] || screen_width[0]<screen_width[1])
     {
         this->resize((screen_height[0]<screen_width[0]?screen_height[0]:screen_width[0])-10,(screen_height[0]<screen_width[0]?screen_height[0]:screen_width[0])-10);

     }
     screen_width[1] = screen_width[0];
     screen_height[1] = screen_height[0];

}

结尾:

在实际操作中,若鼠标拖动过快,会出现无响应的事件,单击非可客户区域即可解决。

(因本人能力有限,若有纰漏请指出,若是有更好的方法,欢迎讨论)

发布了11 篇原创文章 · 获赞 3 · 访问量 2368

猜你喜欢

转载自blog.csdn.net/weixin_42108411/article/details/95053854