这一节主要介绍QWidget的属性,因为内容过多,我们分几个部分讲解。本文讲解的部分为和widget有关的尺寸方面的属性。因为某某类具有什么属性,相应的就会有调整该属性对应的方法函数,所以也就会一并把public function部分的方法函数也会罗列出来,这样以后讲public function的时候篇幅就不会那么多了。
基本参考尺寸 & 增量尺寸QSize baseSize() const
void setBaseSize(const QSize &)
void setBaseSize(int basew, int baseh)
这个属性保存了widget的基本参考尺寸大小,注意这个尺寸可不是初始尺寸!默认情况下,一个新建的widget的基本长和宽大小均为0。一般这个baseSize()属性是为sizeIncrement()(尺寸增量)属性而准备的,当你定义了widget的sizeIncrement()属性的时候,调整窗口会用到baseSize属性。
那就顺便说下这个尺寸增量属性值sizeIncrement()。QSize sizeIncrement()const
void setSizeIncrement(const QSize &)
void setSizeIncrement(int w, int h)
这个属性的意思是这样的,当你用鼠标改变窗体大小的时候是很流畅的,想拖多大就拖多大,是吧?如果你设置了这个增量属性,你每次拖动的时候窗体改变的幅度不再是1像素的变大,而是按照你设置的增量值变大。你要想体验效果的话在Linux系统上试试,Windows不支持。
拖动的时候widget的首选尺寸计算公式中包含baseSize属性,即:
width = baseSize().width() + i * sizeIncrement().width();
height = baseSize().height() + j * sizeIncrement().height();
子widgets边界大小 & 组合区域QRect childrenRect() const
QRegion childrenRegion() const
第一个rect是边界大小,第二个是组合区域。其实rect是两个子widget的矩形区域,而region是两个子widget的组合区域,区别在于一个只是矩形,一个是不规则区域。
框架尺寸QRect frameGeometry() const
QSize frameSize() const
简单区分下QRect和QSize的区别,假如平面上的(100,100)坐标处有个200*200长宽的矩形,如果用QRect表示为QRect(100,100,200,200);如果用QSize表示为QSize(200,200)。
所以上述两个函数的难点在于frame(框架)的理解,如下图:
既然放了这张图,那顺便把其他有关框架尺寸的属性值也一并放上来吧,看图很容易理解吧。const QRect & geometry() const
void setGeometry(int x, int y, int w, int h)
void setGeometry(const QRect &)
这个属性值需要注意的是,当我们改变geometry的时候会立马执行moveEvent()(移动事件)和resizeEvent()(重调大小事件),千万不可在这两个事件函数中再用setGeometry()函数,这样会导致无限递归!int x() const
int y() const
上面的包括下面要说的,这些属性值都是相对于父对象的,如果没有的话,默认为0.QPoint pos() const
void move(int x, int y)
void move(const QPoint &)
注意一点是,千万不可在moveEvent()函数中调用move()函数,这样会导致无限递归!int height() const
int width() const
就是长和宽(不包括frame框架)。注意,如果想要在多屏环境下获取屏幕长宽,这两个函数是不可以的。QRect rect() const
QSize size() const
void resize(int w, int h)
void resize(const QSize &)
void adjustSize()
一个获取区域,一个是获取尺寸大小,都不包括frame(框架),上文已经说过了。同样,在resizeEvent()事件函数中不要调用resize()函数,有可能导致无限递归!
最后一个adjustSize()函数是以sizeHint()为基准的,根据内容来调整widget的大小。virtual QSize sizeHint() const
这个虚函数一般子类化QWidget的时候要重写,也就是一个推荐尺寸,可写可不写。你要是想让自己编写的widget完善各种尺寸,写一写也不费什么事儿,就是个推荐尺寸而已。
最大尺寸 & 最小尺寸bool isMaximized() const
bool isMinimized() const
void showMaximized()
void showMinimized()
void showNormal()
该widget是否为最大化、最小化。后两个是方法,让widget最大化或者最小化,这两个函数起作用的前提是当前的widget类型为window。在X11,由于各家桌面管理器的不同可能会出现些问题。最后一个showNormal()的作用是:让最大化/最小化的widget恢复成正常大小。int maximumHeight() const
int maximumWidth() const
int minimumHeight() const
int minimumWidth() const
void setMaximumHeight(int maxh)
void setMaximumWidth(int maxw)
void setMinimumHeight(int minh)
void setMinimumWidth(int minw)
一组很简单的最大/最小、长/宽限制值。默认的,最大的数都存储16777215,最小的数都存储0. 宏QWIDGETSIZE_MAX的定义给出了widget的最大值。QSize maximumSize() const
void setMaximumSize(const QSize &)
void setMaximumSize(int maxw, int maxh)
QSize minimumSize() const
void setMinimumSize(const QSize &)
void setMinimumSize(int minw, int minh)
上一组指名道姓的设置最大小长宽,这个更加广泛,设置QSize来限值widgte的尺寸。virtual QSize minimumSizeHint() const
这个虚函数也是需要重新实现,这个仅仅是第一次的提示,如果设置了minimumSize(),那么widget将会遵循minimumSize()而忽略本属性。
策略
打开Qt Creator创建个默认的界面工程,在设计师界面右侧可以看到有不同的策略可以选择。其他的效果可以在这里实验,可视化还是比较方便的。QSizePolicy sizePolicy() const
void setSizePolicy(QSizePolicy)
void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
其实策略就是指:默认的布局行为。当有一个QLayout来管理widget的时候,按照QLayout的行为去布局;如果没有QLayout来管理的话,那么就会按照该属性设置的布局行为。
默认的策略为:Preferred/Preferred。这个单词的含义是首选的、优先的。用了这个策略,widget可以自由的变换大小,但比较偏向sizeHint()的尺寸;类似于按钮的widget设置的尺寸策略是水平方向任意拉伸,但是垂直方向固定。类似的还有QLineEdit、QSpinBox等,还有QProgressBar。QToolBar是长方形的,一般双向都可以任意拉伸。支持不同方向上的widget只在各自方向上拉伸,如QSlider、QScrollBar、QHeader,并且它们可以采用比sizeHint()更小的尺寸来布局。
由于QSizePolicy内容略多,不适合在本文中呈现,将会在其他文篇中呈现。