实现思路:
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];
}
结尾:
在实际操作中,若鼠标拖动过快,会出现无响应的事件,单击非可客户区域即可解决。
(因本人能力有限,若有纰漏请指出,若是有更好的方法,欢迎讨论)