QT 界面和控件按某種關係比例增長

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



 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章