QT应用程序分辨率自适应
来源:互联网 发布:mysql语句大全例子 编辑:程序博客网 时间:2024/06/05 21:15
先贴上我自己根据以下文章写的自适应分辨率代码:
//.h文件#ifndef AUTORESIZEWIDGET_H#define AUTORESIZEWIDGET_H#include <QtWidgets/QMainWindow>#include <qmovie.h>#include "ui_autoresizewidget.h"struct AutoResize{QRect m_rect;QFont m_font;};class autoResizeWidget : public QMainWindow{Q_OBJECTpublic:autoResizeWidget(QWidget *parent = 0);~autoResizeWidget();protected:void mousePressEvent(QMouseEvent *);void mouseReleaseEvent(QMouseEvent *);void mouseMoveEvent(QMouseEvent *);void keyPressEvent(QKeyEvent *);void resizeEvent(QResizeEvent *);private:void FindWidgetAllChildren();private:Ui::autoResizeWidgetClass ui;QPoint m_point;bool m_bPress;// 保存最开始的大小和字体QRect m_rect; QFont m_font;QMap<QWidget*, AutoResize> m_wdgtMapSize; //保存所有窗口最开始大小和字体QMovie *m_movie;};#endif // AUTORESIZEWIDGET_H//.cpp文件#include "autoresizewidget.h"#include <qdesktopwidget.h>#include <QMouseEvent>/*根据屏幕大小自适应窗口大小,包括窗口字体,所有窗体,gif都自适应大小。也支持窗口拖拉自适应大小。*/autoResizeWidget::autoResizeWidget(QWidget *parent): QMainWindow(parent){ui.setupUi(this);m_movie = new QMovie("./resouce/scandigitalvein.gif");ui.movielb->setMovie(m_movie);m_movie->start();m_rect = this->geometry();m_font = this->font();int pointsize = m_font.pointSize();m_font.setPixelSize(pointsize * 90 / 72); //设置字体大小单位为像素大小,而不是以磅为单位this->setFont(m_font);QDesktopWidget *widget = QApplication::desktop();// 触发resizeEvent函数调用QRect rect = widget->geometry();this->setGeometry(rect);FindWidgetAllChildren();}autoResizeWidget::~autoResizeWidget(){if (m_movie != NULL){m_movie->stop();delete m_movie;m_movie = NULL;}}void autoResizeWidget::FindWidgetAllChildren(){QList<QWidget*> wls = this->findChildren<QWidget*>();QList<QWidget*>::iterator it = wls.begin();int i = 0;for (; it != wls.end(); it++){AutoResize auresize;auresize.m_rect = (*it)->geometry();auresize.m_font = (*it)->font();m_wdgtMapSize[(*it)] = auresize;i++;printf("i:[%d] [%s]\n", i,(*it)->objectName().toLocal8Bit().data());}}void autoResizeWidget::resizeEvent(QResizeEvent *e){if (m_rect.width() == 0 || m_rect.height() == 0){QMainWindow::resizeEvent(e);return;}//取得长宽的缩放比float scalew = this->width()*1.0 / m_rect.width();float scaleh = this->height()*1.0 / m_rect.height();// 取最小的一个float fontscale = scalew > scaleh ? scaleh : scalew;// 再在原来大小基础上根据缩放比例调整大小QMap<QWidget*, AutoResize>::iterator it = m_wdgtMapSize.begin();for (; it != m_wdgtMapSize.end(); it++){QWidget *item = it.key();int x = (it.value().m_rect.x())*scalew; // 在最开始的大小的基础上乘以缩放比例int y = (it.value().m_rect.y())*scaleh;int w = (it.value().m_rect.width())*scalew;int h = (it.value().m_rect.height())*scaleh;item->setGeometry(QRect(x, y, w, h));QFont font = it.value().m_font;// 取得最开始的字体大小int fontsize = font.pixelSize();if (fontsize == -1){fontsize = font.pointSize();if (fontsize == -1){qreal sizef = font.pointSizeF();font.setPointSizeF(sizef* fontscale);}else{font.setPixelSize(fontsize * fontscale * 90 / 72); // 设置字体大小为像素大小,而不是以磅为单位,//font.setPointSize(fontsize * fontscale);}}else{font.setPixelSize(fontsize * fontscale);}item->setFont(font);// //设置gif根据窗口大小变化 m_movie所对应的lbif (item->objectName() == "movielb"){m_movie->setScaledSize(item->size());}}QMainWindow::resizeEvent(e);}void autoResizeWidget::mousePressEvent(QMouseEvent *e){if (e->button() == Qt::LeftButton){m_bPress = true;m_point = e->globalPos() - this->pos();e->accept();}}void autoResizeWidget::mouseReleaseEvent(QMouseEvent *e){m_bPress = false;}void autoResizeWidget::mouseMoveEvent(QMouseEvent *e){if (m_bPress){move(e->globalPos() - m_point);e->accept();}}void autoResizeWidget::keyPressEvent(QKeyEvent *e){if (e->key() == Qt::Key_Escape){this->close();}}
可以参考下我上传的资源:
qt窗口自适应v2.0
http://download.csdn.net/download/qqwangfan/9879571
QT应用程序分辨率自适应
http://blog.csdn.net/matengxiao/article/details/52853332
以上文章如下:
QT应用程序分辨率自适应
一、应用程序分辨率自适应
为了满足应用程序能在不同尺寸及分辨率的屏幕下能够正常的运行显示,就需要对不同的分辨率进行自适应,而且应用程序分辨率自适应的问题在应用UI设计布局以及UI代码编写阶段进行设计规划,如在界面完成后期再考虑分辨率问题可能需要更大的工作量,并且自适应效果不一定能达到要求。一般来说,应用程序的设计应该按照支持的最小分辨率来进行设计,在应用程序分辨率变化时应用程序中的各个元素进行尺寸的缩放以及位置的调整,同时增加或减少应用程序显示界面内容,同时还要考虑图片失真,控件变形,字体显示等问题。
对于Qt应用来说,官方并没有提供一整套完整的解决有效方案,因此Qt程序的分辨率自适应问题需要按照应用程序的要求,在程序中自己实现相应的控件适应,但是分辨率适配的大体思路都是一致的,即调整控件尺寸及位置以及修改界面元素显示内容,Qt程序又可分为QtWidget程序以及qml程序,下面分别描述这两部分程序的界面分辨力的自适应解决方案。
二、QtWidget中的分辨率自适应
在QtWidget中Qt已经提供有相应的解决方案来实现控件分辨率的自适应,即通过layout对控件进行布局来实现控件的自适应,此外还可以通过自定义QTWidget中控件的自适应策略来实现分辨率自适应,下面分别介绍这两种方法:
2.1layout布局
通过layout布局的方式对QtwWidget的分辨率自适应,即将需要将自适应的控件添加进layout布局中,当layout的父对象的尺寸变化时,layout会根据父对象相应的变化宽、高比例对布局中的控件进行缩放,以此来实现相应控件的分辨率自适应。
通过layout的方式实现控件的方式实现自动缩放使用简单,且无须关注其具体的实现细节,但是这种方式需要就界面刚开始布局时,就要需要采用layout的方式进行布局,但是对于已经完成且没有采用layout布局的界面,可在QtCreator设计器中将需要添加布局的控件选中,然后点击右键,选择栅格化即可。
但是在QtCreator Designer中添加的layout存在一个问题,如下图在Designer中添加一个Vertical Layout,layout中添加两个PushButton,当运行程序后,调整程序大小,中间的PushButton并不会随着窗口大小而进行缩放。
通过查看QtCreator中通过ui文件生成的头文件,即ui_widget.h中的代码可以发现,在QtDesigner中添加layout时,会给layout自动添加一个widget的父对象,即下图中的verticalLayoutWidget,因此verticalLayout会随着其父对象verticalLayoutWidget的大小变化,对其中的控件进行缩放调整,因此才会出现上面的程序窗口变化时,layout中的控件不会自动缩放。
对于上述情况,需要在窗口大小变化时先调整verticalLayoutWidget的位置及大小,这样verticalLayout就会随着窗口大小的变化而自动调整其中的控件,具体操作如下
重载widget的resizeEvent函数,依据窗口大小的变化调整动态verticalLayoutWidget
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
对于控件的缩放和位置调整,都是依据程序窗口的变化来调整的,这里选用horRatio,verRatio两个变量来记录窗口的宽度方向和高度方向的缩放比例,对于verticalLayoutWidget的宽度和高度来说直接按窗口的缩放比例按等比例缩放即可,对于X,Y按比例缩放
resizeRect.setX(widgetX*horRatio);
resizeRect.setY(widgetY*verRatio);
2.1自定义控件缩放
利用layout对控件进行布局缩放使用简单,且无需关注内部细节,但是利用layout进行布局时,控件的位置和大小受布局的约束无法实现大小和位置的精确控制,对于界面又复杂布局要求时layout并不能满足使用要求,对于这部分控件只能自定义控件的缩放,在程序窗口缩放是实现分辨率的自适应。
具体的缩放规则与前面类似,在程序窗口尺寸变化时,即首先获得程序窗口的缩放比例horRatio,verRatio放,然后对各个控件的X,Y以及宽度width和高度height进行相应比例的缩放即可,但是对于每个单独的控件都进行自定义缩放,实现起来较复杂,因此需要采用通用的方法来对各个控件进行缩放。
由于大部分的可以控件都是继承于QWidget的,因此查找到程序中所有的QWidget对象,然后在实现相应的变换即可。Qt提供了findChildren方法可以查找特定类型的子对象,因此可以利用这个方法来实现查找QWidget的子对象,并进行自定义缩放:
首先定义结构体来存储控件的基本尺寸及位置
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
然后在查找窗口中全部的QWidget对象,并记录其初始位置
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
再重载窗口对象的resizeEvent函数,对各个控件进行自适应控制
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
如果界面中有一部分控件包含在layout中,在查找QWidget对象时会把这一部分控件也包含在其中,这样的话在进行尺寸缩放时回合layout相互影响,导致界面发成错位,应去除这些控件,交由layout来控制其缩放,具体操作如下:
首先定义一个函数用于移除其所有子对象
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
查找所有的layout:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2.3字体缩放
Qt中的字体Qfont定义字体大小是有两种方式,一种是PixelSize,另一种是PointSize,PixelSize实际上是以像素为单位,即PixelSize的大小即为实际的像素大小。PointSize的单位不是像素,它是以字体在屏幕实际显示的大小为单位的,它和屏幕的分辨率以及屏幕的真实尺寸相关,即它的单位即为屏幕上显示的字体大小。
对于相同尺寸不同分辨率的屏幕,通过设置PointSize大小的字体,不同分辨率的屏幕上显示的实际字体的大小是一样的,通过设置PointSize的字体来说,字体大小是随着屏幕大小以及分辨率自适应的,因此无须处理字体的缩放;但是对于设置PixelSize大小的字体来说,由于所占分辨率大小固定,因此在相同尺寸上更高分辨率的屏幕上,由于其单位长度内的像素点数更多,即像素密度更大,因此对于更好分辨率的屏幕来说,字体会看起来小一些,要处理这种情况,一种办法就是所有字体都用PointSize来表示大小,但对于已经采用PixelSize的字体来说,就要对其进行控制缩放。
首先创建用于缩放字体的函数
void AutoResize::fontAutoResize(QWidget *obj,int fontSize)
{
if(fontSize<=0)
return;
bool hasTextStyle=false;
fontSize*=m_fontRatio;
QFont changedFont;
changedFont=obj->font();
changedFont.setPixelSize(fontSize);
obj->setFont(changedFont);
}
由于控件都继承与QWidget,且QWidget具有字体属性,因此可以通过QWidget来查找自控件,并记录相应的字体信息
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
计算字体缩放比例
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
重载resizeEvent函数,缩放字体
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
本章节相应的代码和示例请查看本人GitHub
三、qml中的分辨率自适应
qml中没有提供类似QtWidget中的layout进行布局,因此qml中的所有控件的分辨率自适应都需要自定义实现,其自适应原理与QtWidget中类似,都是在程序窗口发生变化时,对窗口尺寸变化事件进行响应,依据父窗口的中宽度以及高度的缩放比例,分辨对各个子对象进行位置以及尺寸的变换。
下面实现一种通用的分辨率自适应的组件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
定义begin( )函数用于才开始时获取程序窗口中要进行缩放的所有子对象的,并记录其基本的尺寸信息,具体试下如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
getAllChildren用于获取某个对象的全部子对象,由于qml中的children只能获得当前对象的直系子对象,对孙子对象等是获取不到的,因此需要递归调用才能获取全部子对象
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
resize函数是在targetItem对象的宽度或这高度发生变化时出发的,用于实现所有子对象的缩放
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
AutoResize.qml的使用示例
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
本章节相应的实例代码请查看本人的GitHub
- QT应用程序分辨率自适应
- QT应用程序分辨率自适应
- QT应用程序分辨率自适应
- qt 之 自适应分辨率
- 关于qt, 系统分辨率自适应
- QT下实现分辨率自适应的方法
- QT下实现分辨率自适应的方法
- QT下实现分辨率自适应的方法
- QT控件自适应缩放以及自适应系统字体与分辨率
- Qt之窗体拖拽、自适应分辨率、自适应大小
- 分辨率自适应
- 分辨率自适应
- 自适应分辨率
- 自适应分辨率
- 自适应分辨率
- 创建分辨率自适应的Windows Phone 8应用程序
- 创建分辨率自适应的Windows Phone 8应用程序
- (转)QT下实现分辨率自适应的方法
- 阿里云(企业云解析DNS)让你的博客飞起来
- freemaker实现导出Excel和word
- Android线程详解
- PHP基础知识03
- easyui 通过判断修改单独行的样式
- QT应用程序分辨率自适应
- ueditor更改工具栏按钮,设置css样式,第二次无法正常加载的解决方法
- 解决ssh-connect-to-host-github-com-port-22-connection-timed-out
- hadoop-2.7.3 在windows环境下安装(无需Cygwin)
- 数据结构之哈希函数
- vue结合bootstrap表单验证 FormValidation 图片验证
- Js数组排序函数sort()介绍
- Map排序
- ROS Gazebo(五):ros_control和gazebo仿真总结