窗体和UI设计师

时间:2021-07-21 03:48:43

QWidget (窗体)是一个采用多重继承的类。首先, QWidget 是一个 QObject ,因此它有父对象、信号、槽以及可受管理的子对象。同时, QWidget 也是一个 QPaintDevice ,这个类是所有可在屏幕上进行“绘制”的对象的基类。
窗体和UI设计师
QWidget与其子对象交互的方式非常有趣。没有父对象的窗体称为窗口。如果一个窗体是另外一个窗体的父对象,那么子对象的边界将完全置于父窗体的边界内部。所有被包含的窗体将按照接受布局规则进行显示。

窗体的分类

QWidget 可以分为四类基本窗体。按钮窗体(button widget),输入窗体(input widget),显示窗体(display widget)是不可交互的,如 QLabel,QProgressBar 和 QPixmap。容器窗体(container widget),如 QFrame,QToolBar,QTabWidget,这类窗体可以包含其它窗体。另外:

  • 上述的窗体可以用来构建其它更为复杂的窗体,比如 QFileDialog,QInputDialog
  • 能够显示数据集合的视图,如 QListView,QTreeView,QColumnView 和 QTableView窗体和UI设计师

还有一些 Qt 类没有任何图形的显示(所以它们都不是窗体),但是在 GUI 开发中使用到。

  • Qt 数据类型—— QPoint,QSize,QColor,QImage 和 QPixmap 是在处理图形对象时经常用到的类型
  • 布局——这些类能够动态地管理窗体的布局。其中有些是常用的特殊布局,包括 QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout 等
  • 模型—— QAbstractItemModel 及其各个派生类,如 QAbstractListModel 和 QABstractTableModel ,外加一些已有的可继承实体类,如 QSqlQueryModel 和 QFileSystemModel ,都是 Qt 模型/视图框架中的一部分。该框架内置将一个模型和其它不同视图相连接的机理,以便对一个组件的修改可以自动变换到其它组件上。
  • 控制器类—— QApplication 和 QAction 两者都是管理GUI应用程序控制流的对象。QItemDelegate 用作模型和视图之间的控制器。

设计师简介

设计师(Designer)是用于应用程序构图和编辑的一个图形化程序,它拥有拖放式的接口和大量节省编程时间和编程精力的一系列特性。设计师的设计阶段的输出是一个称为 className.ui 的XML文件。该文件可以描述一个包含子对象、布局和各个内部连接的设计师窗件,最终 XML 文件会被编译 C++ 头文件,被其它源文件调用。

通过切换到编辑信号/槽 (Edit Signals/Slots,快捷键F4) 模式,可以在各窗体直接拖拉各个连接。一旦连接两个窗体时就会出现选择窗体的信号和另一个窗体的槽的对话框。窗体和UI设计师
在新的连接完成后,通过按 F3 键可以回到窗体编辑模式。利用预览窗体 (Preview Widget,快捷键Ctrl+Alt+R) 模式,就可以对刚刚构建的各个连接进行动态行为预览。

窗体的布局

布局,就是一个仅属于某一窗体的子对象。布局的唯一任务就是合理的组织其拥有的子窗体所占据的空间。
尽管每一个窗体都有一个 setGeometry 函数,也可以通过此函数来设置窗体的大小和位置,但是在窗口应用程序中很少采用绝对大小和绝对位置,其原因就是这种方式通常会使设计过于死板。通过使用布局,可以灵活自然地安排所有的可见空间,从而使得窗口能够成比例地改变大小、拖动或者为窗口加入滚动条。
在屏幕上安排窗体位置和顺序的主要过程,就是讲屏幕空间合理地划分成几个区域,并使用 QLayout 来管理每个区域。布局可以将它们的窗体排列成如下的几种形式:

  • 垂直型(QVBoxLayout)
  • 水平型(QHBoxLayout)
  • 网格型(QGridLayout)
  • 窗体型(QFormLayout)
  • 栈型,任何时候都只有一个窗体可见(QStackedLayout)

可以使用 addWidget 函数向 QLayout 添加窗体。当窗体添加到布局时,它会成为该布局的窗体的子对象。窗体永远不会成为布局的子对象。

布局不是窗体,它们也没有任何可见的表达方式。Qt 提供一个名称为 QLayout 的抽象基类,还提供几个特殊的 QLayout 子类: QBoxLayout,QGridLayout 和 QStackLayout。这些布局类型的每一种都拥有一组合适的函数来控制空间、大小、对齐方式以及对其窗体的访问方式。
布局可以拥有子布局,通过调用 addLayout 函数,可以将一个布局添加为另一个布局的子布局。如果布局的父对象是一个窗体,那么该窗体将再也无法成为另一个布局的父对象。

分隔,伸展和支撑

可以使用 QLayout 类的API来直接指定各个窗体之间的分隔(spacer)、伸展(stretch)和支撑(strut)

  • addSpacing(int size)会向布局的末尾添加固定数量的像素
  • addStretch(int stretch = 0) 会添加数目不定的像素。此函数由一个最小的数目,然后逐渐扩展到使用所有的可用空间。
  • addStrut(int size)将给垂直方向施加一个最小的数值。

大小策略和大小提示

每个 QWidget 都有一些与屏幕尺寸相关的属性。一些窗体可以在运行时使用一个或多个方向上的额外空间。通过设置自定义窗体的 sizePolicy 值和 sizeHint 值,可以控制其默认的大小变化行为。
QSize 定义窗体的宽度和高度的大小。还有一些成员函数可以用来完全控制自定义窗体在运行时的大小,包括 setMinimuSize(),setMaximumSize(),setMinimumHeight(),setMaximumWidth()等。
每个 QWidget 和 QLayout 都有一个水平方向和垂直方向的 QSizePolicy 。同样也有一些大小的策略来表达窗体或布局大小被改变时自身的意愿。如:Minimum,Maximum,Fixed,Preferred 等。默认的大小策略是 Preferred/preferred ,这表示 sizeHint 会让窗体拥有较好的大小。

图标,图像和资源

使用图形化的图片可以给应用程序添加可视化效果。
Qt 允许工程使用二进制资源,比如图像、声音、图标、某些外来字体的文字,等等。这些资源通常存储在独立的二进制文件中。在实际工程中集成二进制文件的好处在于它们可以使用不依赖于本地文件系统的路径来寻址,并且可以随可执行文件进行自动部署。
Qt 提供至少两种方式来获得标准的图标。一个方式来自桌面样式的 QStyle::standardIcon() ,另一种则来自插件型图标主题: QIcon::fromTheme()。 但是,你或许还希望使用一些来自其它资源的额外图标。
第一步是在一个资源集合文件中列出希望使用的二进制文件,该资源文件是一个以 .qrc 为后缀的 XML 文件。

<RCC>
<qresource prefix="/new/prefix1">
<file>C:/Users/dong.po/Pictures/10.png</file>
</qresource>
</RCC>

需要在每个还有 qrc 文件的工程文件中添加 RESOURCES

RESOURCES += image.rc

在构建该工程时,rcc 会额外生成一个名为 qrc_fileName.cpp 的文件,它含有 C++ 中定义的字节数组。
把需要的二进制数据文件作为资源附加到工程会让工程更为健壮。源代码无须为资源文件使用一些不可移植的路径名。要引用一个存储为资源的文件,可以使用时在前面加上一个前缀”:/”。于是,每个资源好像都位于一个私有虚拟文件系统中,其根为”:/”。然而,得到这些好处需要付出一些代价。可执行文件会更大,程序也需要更多的内存。

有三个Qt类可以简化处理图片。

  • QImage ——用于离屏(off-screen)操作,输入输出操作,并可直接访问像素。
  • QPixmap ——用于在屏幕上进行绘制并优化。仅用于主线程。
  • QIcon ——常用于视频内存的缓冲,但仅用于主线程中。
  • QPicture ——存储绘制的操作而不是实际的位图图片。