QT 界面和控件按某种关系比例增长

来源:互联网 发布:绿盾防泄密软件 编辑:程序博客网 时间:2024/05/01 07:08

今天某个客户超级坑爹居然要求里面显示图片的graphicView成4:3增长,但是现在屏幕都是按照宽屏的,即使比例按照16:9,也不科学。

怎么说都不听,坑爹,好吧,拉长之后会变成这样的


然后主界面要根据graphicView增长而改变,反正,布局不能有空隙。

实在无奈就实现出来了。效果图:

 当然还是这样好看啦

 

 

原理:

根据变化,由高度,因为都是宽屏,高度是短板,算出长度多少,先变化再缩回来。里面有个地方有陷阱的是,

变化窗口触发QWidget::resizeEvent(QResizeEvent * event),千万不可以在里面修改大小resize ( w, h );

因为会造成嵌套死循环。我试过,用emit发送信号也不行,所以就用了个笨方法,用timer延时,再触发修改大小函数。

 

下面是代码,标记部分是新加入,不含头文件。

class QResizeTest_Again : public QMainWindow{Q_OBJECTpublic:QResizeTest_Again(QWidget *parent = 0, Qt::WFlags flags = 0);~QResizeTest_Again();void  resizeEvent ( QResizeEvent * event ) ;///////////////////////public slots://void my4_3resizeSlots(int w,int h);void my4_3resizeSlots();//////////////////////////////////////////signals:void my4_3resizeSignals(int w,int h);private:Ui::QResizeTest_AgainClass ui;QTimer timer;/////////////////////////////////////////////////int winShouldBeWidth;////////////////////////////////////////int winShouldBeHeight;////////////////////////////////////////};

 

QResizeTest_Again::QResizeTest_Again(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags){ui.setupUi(this);connect(&timer,SIGNAL(timeout()),this,SLOT(my4_3resizeSlots()));/////////////////////////}QResizeTest_Again::~QResizeTest_Again(){}//////////////////////////////////////////////////////////void  QResizeTest_Again::resizeEvent ( QResizeEvent * event ) {//如果窗口最大化,不修改比例,防御性设计if (isMaximized()){return;}QSize oldSize = event->oldSize();QSize newSize = event->size();//计算graphicsView的4:3长,然后加上固定值返回,重设窗口double rate = 4/3;int fixHeight = 144;int fixWidth = 350;int graphicHieght,graphicWidth;graphicHieght = newSize.height() - fixHeight;graphicWidth = (int)((double)graphicHieght * rate);int shouldBeWidth = graphicWidth + fixWidth;qDebug()<<shouldBeWidth << newSize.height();//好了就不用再发送了,避免嵌套if (shouldBeWidth != newSize.width()){//ui.graphicsView->resize(graphicWidth,graphicHieght);winShouldBeHeight = newSize.height();winShouldBeWidth = shouldBeWidth;timer.start(1);}}///////////////////////////////////////////////////////////void QResizeTest_Again::my4_3resizeSlots(){//qDebug()<<"321";resize(winShouldBeWidth,winShouldBeHeight);timer.stop();}