今天某个客户超级坑爹居然要求里面显示图片的graphicView成4:3增长,但是现在屏幕都是按照宽屏的,即使比例按照16:9,也不科学。
怎么说都不听,坑爹,好吧,拉长之后会变成这样的
然后主界面要根据graphicView增长而改变,反正,布局不能有空隙。
实在无奈就实现出来了。效果图:
当然还是这样好看啦
原理:
根据变化,由高度,因为都是宽屏,高度是短板,算出长度多少,先变化再缩回来。里面有个地方有陷阱的是,
变化窗口触发QWidget::resizeEvent(QResizeEvent * event),千万不可以在里面修改大小resize ( w, h );
因为会造成嵌套死循环。我试过,用emit发送信号也不行,所以就用了个笨方法,用timer延时,再触发修改大小函数。
下面是代码,标记部分是新加入,不含头文件。
class QResizeTest_Again : public QMainWindow { Q_OBJECT public: 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(); }