`
qimo601
  • 浏览: 3444103 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

【转】如何在Qt 4程序中优化布局结构-兼回答网友提问

    博客分类:
  • Qt
阅读更多

 

 

在迄今为止讲到每一个例子中,我们只是简单的把窗口部件放置到某个确定的布局中。但在某些情况下,由此形成的布局看起来可能还不是我们最想要的形式。在这些情形中,可以通过改变要摆放的窗口部件的大小策略和大小提示来调整布局。

1.大小提示(size hint)和最小大小提示(minimum size hint

在介绍Qt窗口部件的大小策略之前,首先介绍大小提示(size hint)和最小大小提示(minimum size hint)。

⑴ 大小提示

大小提示是Qt为一个窗口部件推荐的尺寸。当Qt GUI窗口部件进行初始化时,将通过QWidget::sizeHint()来获得窗口部件的大小提示,这是一个虚函数,它的原型为:

     virtual QSize sizeHint () const

 

在未被重载的情况下,它的返回值是这样的:

  如果该窗口部件不属于任何布局管理器,那么该函数将返回一个无效的值;

  如果该窗口部件属于某个布局管理器,那么该函数将返回一个该布局管理器认为比较合适的尺寸。

⑵ 最小大小提示

最小大小提示(minimum size hint)是Qt为窗口部件推荐的最小尺寸,它的使用规则是:

如果需要绘制的窗口部件的尺寸(包括长和高两个方面)小于其最小提示(这在Qt Designer中往往表现为有些被压缩的看不到它的内容),并且该窗口部件的最小提示在最大尺寸和最小尺寸允许的范围内,那么该窗口部件显示的尺寸将是其最小提示的值。

设置窗口部件的最小大小提示是通过QWidget::minimumSizeHint()完成的。它的返回值有如下情景:

  如果该窗口部件没有布局管理器,该函数返回一个无效的值;

  如果该窗口部件属于某个布局管理器,该函数返回布局管理器认为合适的一个尺寸。

2.大小策略(size policy

    一个窗口部件的大小策略会告诉布局系统应该如何对它进行拉伸或收缩。Qt为它所有的内置窗口部件都提供了合理的默认大小策略值,但是由于不可能为每一种可能产生的布局都提供唯一的默认值,所以在一个窗体中,开发人员改变它上面的一个或两个窗口部件的大小策略是非常普遍的现象。一个QSizePolicy既包含一个水平分量也包含一个垂直分量。以下是一些常用的取值:

                                                                     表11-1枚举值QSizePolicy::Policy的内容

枚举常量

说明

QSizePolicy::Fixed

0

大小提示是该窗口部件的唯一尺寸选择,所以它不会发生任何的伸缩。

QSizePolicy::Minimum

GrowFlag

大小提示是该窗口部件的最小尺寸,它不会变得更小,但它可以变得更大,不过采用该策略的窗口部件在“争夺”空间上不占优势。

QSizePolicy::Maximum

ShrinkFlag

大小提示是该窗口部件的最大尺寸,也就是该窗口部件不会比大小提示的尺寸更大。该窗口部件可以在没有受到其它窗口部件“要求”的情况下,自由的缩小尺寸。

QSizePolicy::Preferred

GrowFlag | ShrinkFlag

一般情况下,该窗口部件会将大小提示作为它的优先和最佳选择,但它也可以变得足够的小,也可以变大,但不占优势。该策略是QWidget窗口部件默认的策略。

QSizePolicy::Expanding

GrowFlag | ShrinkFlag | ExpandFlag

采用该策略的窗口部件也能够感觉到尺寸提示,但是它倾向于尽可能的占用更大的空间,该窗口部件也可以变得足够小。

QSizePolicy::MinimumExpanding

GrowFlag | ExpandFlag

大小提示将是该窗口部件的最小尺寸,该窗口部件将尽可能的占用更多的空间。该策略已经不再被推荐使用,建议用Expanding替代它,并且重载minimumSizeHint()

QSizePolicy::Ignored

ShrinkFlag | GrowFlag | IgnoreFlag

Expanding有些相似,只是所有的大小提示都被忽略,该窗口部件将会尽可能的占用空间。

 

11-1中的“值”这一列实际上告诉了我们每一种策略一般是具有“倾向性”的,比如QSizePolicy::Fixed的值为0,则它“倾向于”保持自己的大小不变,即保持大小提示的尺寸。而QSizePolicy::Expanding的值是3个值的叠加,总的“倾向性”是趋于占用更多空间的,等等。这就为当多个具有不同大小策略的窗口部件放置在一起时,如何判断它们占用空间的模式提供了基本的判断依据,以下是几种常见的组合。

◆ 相同大小策略的窗口部件被布局管理器组合在一起。在这种情况下,除了窗口部件不能超出它的大小范围外,不同的窗口部件可以按自己的伸缩因子在其允许的范围内自由的伸缩。

 QSizePolicy::Fixed和任何其他的大小策略组合在一起。

具有QSizePolicy::Fixed大小策略的窗口部件其大小是不变的,即保持在sizeHint()大小,而其他的窗口部件可以在允许的范围内自由伸缩。

 QSizePolicy::PreferredQSizePolicy::Expanding组合在一起。

具有QSizePolicy::Preferred尺寸策略的窗口部件其大小是不变的,即它认为大小提示是最适合它的,而其他的窗口部件大小可以在其允许的范围内自由伸缩。

 QSizePolicy::Ignored和其他尺寸策略(QSizePolicy::Fixed策略除外)组合在一起的时候,不同的窗口部件在各自允许的范围内自由伸缩。

 QSizePolicy::PreferredQSizePolicy::MinimumQSizePolicy::Maximum组合在一起的时候,各窗口部件在各自允许的范围内可以自由伸缩。

3.伸缩因子(stretch factor

    除了大小策略中包含的水平方向和垂直方向两个分量之外,QSizePolicy类还保存了水平方向和垂直方向的一个伸缩因子。这些伸缩因子可以用来说明在增大窗体时,对不同的子窗口部件应使用的不同放大比例。即需要设置QSizePolicy::horizontalStretchQSizePolicy::verticalStretch的值来实现。默认情况下,被布局管理器组合在一起的窗口部件的伸缩因子是相等的,都为0。此时,在所有的窗口部件都没有超出各自的大小范围允许的情况下,窗口部件的大小始终相等。

例如,假定在一个QListWidget的右面还有一个QTextEdit,并且希望这个QTextEdit的长度能够是QListWidget长度的两倍,那么就可以把这个QTextEdit在水平方向上的拉伸因子(QSizePolicy::horizontalStretch)设置为2,而把QListWidget在水平方向上的拉伸因子(QSizePolicy::horizontalStretch)设置为1;垂直方向上保持默认为0,即两者一样的高。这样设置的效果如图11-10所示。

 

 

4.大小约束(size constraint

影响布局方式的另一种方法是设置它的子窗口部件的最大大小、最小大小或固定大小。这些是通过设置sizeConstraint属性来完成的。该属性值是一个枚举常量,定义了布局的大小约束的模式。表列出了它所有可能的取值,它的默认值是QLayout::SetDefaultConstraint。获取和设置该属性值可以通过QWidget::layout()来获取主窗口部件的布局管理器,然后可以调用QLayout::sizeConstraint()函数来查看当前的设置情况,然后再通过QLayout::setSizeConstraint()函数来设置该布局管理器的sizeConstraint属性。这两种函数的原型如下:

     SizeConstraint sizeConstraint () const
     void setSizeConstraint ( SizeConstraint )

其中,SizeConstraint的取值即是在表11-2中的枚举值的范围内。

           表11-2 布局管理器的大小约束属性(QLayout::SizeConstraint)可能的取值

 

枚举常量

说明

QSizePolicy::Fixed

0

大小提示是该窗口部件的唯一尺寸选择,所以它不会发生任何的伸缩。

QSizePolicy::Minimum

GrowFlag

大小提示是该窗口部件的最小尺寸,它不会变得更小,但它可以变得更大,不过采用该策略的窗口部件在“争夺”空间上不占优势。

QSizePolicy::Maximum

ShrinkFlag

大小提示是该窗口部件的最大尺寸,也就是该窗口部件不会比大小提示的尺寸更大。该窗口部件可以在没有受到其它窗口部件“要求”的情况下,自由的缩小尺寸。

QSizePolicy::Preferred

GrowFlag | ShrinkFlag

一般情况下,该窗口部件会将大小提示作为它的优先和最佳选择,但它也可以变得足够的小,也可以变大,但不占优势。该策略是QWidget窗口部件默认的策略。

QSizePolicy::Expanding

GrowFlag | ShrinkFlag | ExpandFlag

采用该策略的窗口部件也能够感觉到尺寸提示,但是它倾向于尽可能的占用更大的空间,该窗口部件也可以变得足够小。

QSizePolicy::MinimumExpanding

GrowFlag | ExpandFlag

大小提示将是该窗口部件的最小尺寸,该窗口部件将尽可能的占用更多的空间。该策略已经不再被推荐使用,建议用Expanding替代它,并且重载minimumSizeHint()

QSizePolicy::Ignored

ShrinkFlag | GrowFlag | IgnoreFlag

Expanding有些相似,只是所有的大小提示都被忽略,该窗口部件将会尽可能的占用空间。

 

5.空白(margin)和间距(spacing

每种布局都有两个重要的属性,空白和间距。空白指的是整个布局四周距离窗体边缘的距离;间距指的是布局管理器内部各个窗口部件之间的距离。

空白属性即margin(),间距属性即spacing(),它们的默认值是有窗体的风格决定的。Qt的默认风格下,子窗体部件的margin()的值是9英寸,窗体的margin()值是11英寸。spacing()的值与margin()相同。

如果要设置这两个值可以通过setMargin()setSpacing()

注意,从Qt4.3开始,margin()属性已经逐渐不再被Qt4所推荐,更好的设置空白的方法是使用setContentsMargins()方法,它的原型如下:

     void QLayout::setContentsMargins ( int left, int top, int right, int bottom )

其中,lefttopright bottom表示环绕在布局周围的空白。

对于QGridLayout QFormLayout,不要使用setSpacing()方法,而是要分别使用setHorizontalSpacing()setVerticalSpacing()方法来设置水平和垂直方向的间距。如果你使用了setSpacing()方法,获取spacing()时,它的返回值将为-1

http://blog.csdn.net/qter_wd007/article/details/5377882    作者 qter_wd007

 

分享到:
评论

相关推荐

    Qt-Advanced-Docking-System-master

    本主题将深入探讨Qt中的高级停靠系统,该系统是Qt库中的一个关键特性,尤其在构建具有复杂界面布局的应用程序时显得尤为重要。 一、Qt框架简介 Qt由Trolltech公司(现为The Qt Company)开发,使用C++语言编写,并...

    qt-unified-windows-x86-online.exe

    "qt-unified-windows-x86-online.exe" 是一个用于Windows 32位系统的QT在线安装程序,它提供了方便的方式来下载和安装QT开发环境。 这个安装程序的核心功能包括: 1. **集成安装器**:qt-unified-windows-x86-on...

    QT程序调试器——qtcreator-gdb-7.4-MINGW32_NT-6.1-i686

    总结起来,"qtcreator-gdb-7.4-MINGW32_NT-6.1-i686"是QT开发者在Windows环境下调试QT4.8.5程序的强大工具,结合QT Creator的可视化界面和GDB的调试功能,可以高效地定位和解决代码中的问题,提升开发效率。

    qt4.8.7+qt-vs-addin-1.1.11.rar

    而QT-vs-addin-1.1.11则确保了在VS2010中的开发体验与在原生QT环境中几乎无异,这对于团队协作和项目管理尤为重要。 总的来说,这个压缩包提供了一套完整的解决方案,使得开发者能够在Visual Studio 2010中无缝地...

    QT-vs-addin-1.2.4-opensouce

    QT-vs-addin-1.2.4-opensource是针对Visual Studio(VS)的插件,其主要目的是将Microsoft Visual Studio集成开发环境(IDE)与QT库相结合,为开发者提供一个便捷的工具,以便在Windows平台上使用VS进行QT应用程序的...

    qt-opensource-windows-x86-msvc2010-5.5.1

    总的来说,"qt-opensource-windows-x86-msvc2010-5.5.1"与"qt-vs-addin-1.2.5"结合使用,为Windows平台上的QT开发提供了一套全面的解决方案,让开发者能够在熟悉的Visual Studio环境中高效地开发出高质量的跨平台...

    qt-vs-addin-1.2.5+qt-creator-5.0.3

    在给定的压缩包文件中,我们有两个关键组件:qt-vs-addin-1.2.5和qt-creator-5.0.3。 首先,qt-vs-addin-1.2.5是Visual Studio的一个插件,它允许开发者在Microsoft Visual Studio 2010环境中直接进行QT项目的开发...

    Qt4 图形设计与嵌入式开发--源代码

    《Qt4图形设计与嵌入式开发--源代码》是一个集合了多个Qt开发实例的资源包,对于想要深入了解和学习Qt框架,特别是涉及到嵌入式系统开发的开发者来说,这是一个非常有价值的参考资料。Qt是一个跨平台的C++图形用户...

    vs2017的qt插件qt-vsaddin-msvc2017-2.8.1-rev.06.vsix.rar

    《Visual Studio 2017中的Qt插件:qt-vsaddin-msvc2017-2.8.1-rev.06》 在软件开发领域,集成开发环境(IDE)如Microsoft的Visual Studio 2017为程序员提供了丰富的功能和便利。然而,对于使用Qt框架的开发者来说,...

    qttools-everywhere-src-5.15.0.zip

    在软件开发领域,Qt是一个广泛使用的跨平台应用程序框架,它提供了丰富的库、工具和开发环境,支持C++语言,同时也提供了QML进行UI设计。本次我们将深入探讨的是“qttools-everywhere-src-5.15.0”这个压缩包,它...

    qt Qt-Advanced-Docking-System 使用教程 示例代码

    在布局方面,Qt-Advanced-Docking-System允许你创建复杂的停靠布局,包括水平和垂直堆叠、网格布局,甚至可以创建多层嵌套的停靠区域。通过`DockLayout`类,你可以精确控制各个DockWidget的位置和尺寸。 对于...

    qt-opensource-windows-x86-5.14.2

    在该压缩包中,"qt-opensource-windows-x86-5.14.2"很可能包含以下组件: 1. **安装程序**: 一个可执行文件,用于在Windows系统上安装Qt开发环境,包括编译器、Qt库、开发工具和示例代码等。 2. **Qt库**: 包含所有...

    qt-vs-addin-1.2.4-opensource

    qt-vs-addin-1.2.4-opensourceQt,坦白来说,并不只是一个界面库,他是C++编程思想的集大成者。它是得到完善的C++应用程序框架。使用Qt,在一定程度上你获得的是一个“一站式”、“全方位”的解决方案,STL。string...

    qt-opensource-windows-x86-5.14.2.exe

    首先,QT 5.14.2版本在性能上进行了优化,使得应用程序运行更加流畅,内存占用更低。这包括了对图形渲染和事件处理的提升,以及对多线程和并发编程的支持增强。对于开发者来说,这意味着能够创建更高效的应用程序,...

    qt-win-opensource-4.8.5-vs2010.exe

    通过qt-win-opensource-4.8.5-vs2010.exe安装包,开发者可以将Qt框架集成到Visual Studio 2010中,这意味着他们可以利用VS的全部功能来开发Qt应用程序,而无需离开熟悉的开发环境。 集成过程通常涉及以下步骤: 1. ...

    《C++ GUI Qt 4 编程(第二版)》《C++ GUI programming with Qt4》高清-中文版-扫描版-PDF-part3

    《C++ GUI Qt 4 编程(第二版)》《C++ GUI programming with Qt4》高清-中文版-扫描版-PDF 分辨率在500dpi左右,清晰度,绝对高清有保证! 书签-封面-所有信息齐全。 绝对原版扫描,一页不漏! 由于文件大(清晰度...

    qt-opensource-windows-x86-5.12.1安装包

    4. 配置环境变量:安装完成后,需要配置环境变量,以便在命令行或 IDE 中使用 Qt 5.12.1。 Qt 5.12.1 的应用场景 Qt 5.12.1 广泛应用于多种领域,包括: 1. 桌面应用程序开发:Qt 5.12.1 提供了强大的桌面应用...

    qt-everywhere-opensource-src-5.7.1.tar.gz

    "qt-everywhere-opensource-src-5.7.1.tar.gz" 是一个包含Qt开源源码的压缩包,适用于版本5.7.1。Qt是一个强大的跨平台应用程序开发框架,支持Windows、Linux、macOS、Android以及iOS等多个操作系统。这个压缩包主要...

    qt-opensource-windows-x86-5.13.2.exe

    qt-opensource-windows-x86-5.13.2.exe

    MSVC版qt qt-opensource-windows-x86-msvc2015_64-5.8.0

    qt-opensource-windows-x86-msvc2015_64-5.8.0:vs2015版本的qt,解决官网下载不了的问题,已存在百度网盘

Global site tag (gtag.js) - Google Analytics