按钮组件

QT Widgets支持如下6种按钮:
image.png

  1. QPushButton:下压按钮,通常用于执行命令或触发事件
  2. QToolButton:工具按钮,通常在 ToolBar 里面。工具按钮通常显示的是图标,而不是文本标签
  3. QRadioButton:单选按钮,通常成组出现,用于提供两个或多个互斥选项
  4. QCheckBox:多选按钮,与 RadioButton 的区别是选择模式,单选按钮提供多选一,复选按钮提供多选多
  5. QCommandLinkButton:命令链接按钮,也用于在互斥选项中选择一项 ,默认情况下,它也将携带一个箭头图标,表明按下按钮将打开另一个窗口或页面。样式如下:

image.png

  1. QDialogButtonBox:对话框按钮,常用于对话框里自定义按钮,比如“确定”和“取消” 按钮等。可以在构造函数种指定如下enum类型生成特定的按钮: ```cpp enum StandardButton { NoButton = 0x00000000, Ok = 0x00000400, Save = 0x00000800, SaveAll = 0x00001000, Open = 0x00002000, Yes = 0x00004000, YesToAll = 0x00008000, No = 0x00010000, NoToAll = 0x00020000, Abort = 0x00040000, Retry = 0x00080000, Ignore = 0x00100000, Close = 0x00200000, Cancel = 0x00400000, Discard = 0x00800000, Help = 0x01000000, Apply = 0x02000000, Reset = 0x04000000, RestoreDefaults = 0x08000000,

ifndef Q_MOC_RUN

  1. FirstButton = Ok,
  2. LastButton = RestoreDefaults

endif

};

<a name="vZF2k"></a>
# 文本输入
![image.png](https://cdn.nlark.com/yuque/0/2021/png/690827/1624859209815-b302a41e-b67d-45ed-bc6c-99fc232ebadf.png#clientId=ub337033e-ee7c-4&from=paste&id=u9eb6bf4e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=208&originWidth=508&originalType=binary&ratio=2&size=24737&status=done&style=none&taskId=ube32197b-52d1-4243-8071-9b3b3ce3491)

1. Comb Box:选项框,通常用于显示选项列表
1. Font Comb Box:字体选项框,允许用户选择字体(自动读取系统字体)。常用于工具栏,与 ComboBox 一起用于控制字体大小,并与两个 ToolButtons 一起用于粗体和斜体
1. Line Edit:单行编辑框
1. Text Edit:文本编辑框,用于段落和字符,还可以显示图像,列表和表格。如果文本太大而无法在文本编辑的视图中查看,视图中则会出现滚动条
1. Plain Text Edit:纯文本编辑框
1. Spin Box:数字旋转框,允许用户通过单击上/下按钮或按下键盘上的上/下按钮来选择一个值,也可以手动输入值
1. Double Spin Box:双精度数字旋转框,用于浮点数,比Spin box精度更高
1. Time Edit:时间编辑框
1. Date Edit:日期编辑框
1. Date/Time Edit:日期时间编辑框,允许用户使用键盘或箭头键编辑日期,以增加或减少日期和时间值
1. Dial:数字拨盘框,提供了一个圆形范围控制(如速度计或电位器)
1. Horizontal Scroll Bar:水平滚动条
1. Vertical Scroll Bar:垂直滚动条
1. Horizontal Slider:水平滑动条
1. Vertical Slider:垂直滑动条
1. Key sequence Edit:按键序列编辑框,当小部件接收到焦点并在用户释放最后一个键后一秒结束时,将启动记录,通常用于**记录快捷键**。
<a name="AgZJz"></a>
# 内容显示
![image.png](https://cdn.nlark.com/yuque/0/2021/png/690827/1624864543833-abe23d38-1af4-4e43-9dae-41429d69be3f.png#clientId=uc90b959a-fd71-4&from=paste&id=u5407b535&margin=%5Bobject%20Object%5D&name=image.png&originHeight=134&originWidth=479&originalType=binary&ratio=2&size=14895&status=done&style=none&taskId=u43f1679d-013b-41e1-98c3-687c20ae522)

1. Label:标签,用于文本或图像显示
1. Text Browser:文本浏览器,提供了一个具有超文本链接导航的文本浏览器
1. Graphics View:图形视图,提供了基于图元的模型/视图编程,用于浏览图片和显示不同样式(缩放,旋转等)
1. Calendar Widget:日历,提供了一个基于月的日历小部件,允许用户选择日期
1. LCD Number:液晶数字,显示一个类似于 lcd 的数字,可以显示十进制、十六进制、八进制或二进制数字
1. Progress Bar:进度条
1. Horizontal Line:水平线
1. Vertial Line:垂直线
1. OpenGL Widget:开放式图形库工具
1. QQuick Widget:嵌入式 QML 工具
<a name="0JYUm"></a>
# 布局组件
Qt 为界面设计提供了丰富的布局管理功能,在 UI 设计器中,组件面板里有 Layouts 和 Spacers 两个组件面板,提供了如下组件:

| 布局组件 | 功能 |
| --- | --- |
| Vertical Layout | 垂直方向布局,组件自动在垂直方向上分布 |
| Horizontal Layout | 水平方向布局,组件自动在水平方向上分布 |
| Grid Layout | 网格状布局,网状布局大小改变时,每个网格的大小都改变 |
| Form Layout | 窗体布局,以两列的形式布局其子类。左列由标签组成,右列由“字段”小部件(QLineEdit(行编辑器)、 QSpinBox(旋转框等))组成。比如登录窗口的布局 |
| Horizontal Spacer | 一个用于水平分隔的空格 |
| Vertical Spacer | 一个用于垂直分隔的空格 |

<a name="iSV2t"></a>
# 容器组件
![image.png](https://cdn.nlark.com/yuque/0/2021/png/690827/1624865782114-5a532f90-d3dd-429b-bca2-c1347b5667b3.png#clientId=ueb7831af-9f47-4&from=paste&id=uefe8a515&margin=%5Bobject%20Object%5D&name=image.png&originHeight=137&originWidth=464&originalType=binary&ratio=2&size=13117&status=done&style=none&taskId=u005db9dd-79ff-4db5-b047-2ab69db623f)

1. Group Box:分组框,通常带一个边框和标题栏,使用水平或垂直布局
1. Scroll Area:滚动区域,如果内容超过容器大小,会自动出现滚动条
1. Tool Box:工具箱,类似抽屉,提供一种列状的层叠窗口,每个窗口显示一列选项卡,多列重叠。比如:

![image.png](https://cdn.nlark.com/yuque/0/2021/png/690827/1624892578524-4ce4c387-7082-454a-9096-7e0638d561ee.png#clientId=u90af67b3-75f1-4&from=paste&height=205&id=u63fb33c6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=342&originWidth=333&originalType=binary&ratio=2&size=30274&status=done&style=none&taskId=ucb14bd6d-1ddf-4c94-8853-1bd5349e483&width=200)

4. Tab Widget:选项卡多标签页,用于分页显示,每页一个界面
4. Stacked WIdget:小部件堆栈,一次只能看到一个组件。常与 QListWidget 搭配使用,效果如下:

![image.png](https://cdn.nlark.com/yuque/0/2021/png/690827/1624892684191-f424365d-39e4-4c46-8e5a-2e1de828abb5.png#clientId=u90af67b3-75f1-4&from=paste&height=247&id=uee9263f3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=493&originWidth=883&originalType=binary&ratio=2&size=57938&status=done&style=none&taskId=u10851a12-a6cf-4383-957b-b5703297590&width=441.5)

6. Frame:是**所有框架的窗口部件的基类**,它绘制框架并且调用一个虚函数 drawContents()来填充这个框架。Frame绘制属性:
```cpp
//形状
enum Shape {
    NoFrame  = 0, //无形状
    Box = 0x0001, // 矩形框
    Panel = 0x0002, //使内容看起来凸起或凹陷的框
    WinPanel = 0x0003, // 类似panel,绘制windows效果
    HLine = 0x0004, // 水平线
    VLine = 0x0005, // 垂直线
    StyledPanel = 0x0006 //调用QS太远了::drwaPanel绘制
};
//阴影效果
enum Shadow {
    Plain = 0x0010, //使用前景色,五三维效果
    Raised = 0x0020, //三维凸起线
    Sunken = 0x0030 //三维凹陷线
};
  1. Widget:所有用户界面组件的基类,是最基本元素,一般用于容纳其他widget窗口
  2. MDI Area:MDI区域,显示MDI框架
  3. Dock Widget:停靠窗体部件,可以停靠在main window,也可以作为桌面的顶级窗口浮动

    view显示组件

    image.png

    基于模型的view组件

  4. List View:清单视图,使用内部模型来管理列表项,需要自己管理数据。下面的也类似

  5. Tree View:树形视图
  6. Table View:表视图
  7. Column View:列表视图,比如用于省市区的选择
  8. Undo View:撤销列表视图,显示撤销堆栈上的命令列表,对战发生变化时,视图自动更新

如下QT现成的数据模型,可以用在上面的组件中:

  • QStringListModel 用于存储简单的 QString 列表
  • QStandardItemModel 管理复杂的树型结构数据项,每项都可以包含任意数据
  • QDirModel 提供本地文件系统中的文件与目录信息。
  • QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel 用来访问数据库。

使用示例:

/* 实例化 */
listView = new QListView(this);
/* 将 listView 居中 */
setCentralWidget(listView);

QStringList strList;
strList<<"高三(1)班"<<"高三(2)班"<<"高三(3)班";

/* 实例化字符串模型 */
stringListModel = new QStringListModel(strList);

/* 设置数据模型,向表中插入一段数据 */
listView->setModel(stringListModel);
/* 设置为视图为图标模式 */
listView->setViewMode(QListView::IconMode);

基于项的view组件

  1. list widget:提供一个基于项的列表,比list view先进,已经有数据存储模型,可以直接additem
  2. tree widget:使用预定义的树模型显示列表项,也已经有数据模型了
  3. table Widget:提供基于项的数据表格,也有默认数据模型

其他设置

伙伴关系

单击“Edit Buddies”按钮可以进入伙伴关系编辑状态,按住鼠标左键,然后拖向一个组件,就建立了 Label 和组件之间的伙伴关系。
伙伴关系(Buddy)是指界面上一个 Label 和一个组件相关联,是为了在程序运行时,在窗体上用快捷键快速将输入焦点切换到某个组件上。

比如下面界面中,设定“姓名”标签的 Text 属性为“姓名(&N)”,其中符号“&”用来指定快捷字符,界面上并不显示“&”,这里指定快捷字母为 N。那么程序运行时,用户按下 Alt+N,输入焦点就会快速切换到“姓名”关联的输入框内。
image.png

Tab顺序

Tab 顺序是指在程序运行时,按下键盘上的 Tab 键时输入焦点的移动顺序。一个好的用户界面,在按 Tab 键时,焦点应该以合理的顺序在界面上移动,而不是随意地移动。
单击“Edit Tab Order”按钮进入Tab 顺序编辑状态。进入 Tab 顺序编辑状态后,在界面上会显示具有 Tab 顺序组件的编号,依次按希望的顺序单击组件,就可以重排 Tab 顺序了。没有输入焦点的组件是没有 Tab 顺序的,如 Label 组件。
image.png