今天某個客戶超級坑爹居然要求裏面顯示圖片的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();
}