现在的位置: 首页 > 综合 > 正文

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

2013年03月16日 ⁄ 综合 ⁄ 共 2031字 ⁄ 字号 评论关闭

今天某个客户超级坑爹居然要求里面显示图片的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();
}

 

 

抱歉!评论已关闭.