命令行:
- qmake -projct
- qmake
- make
Log调试法:
在代码中加入一定的打印语句
打印程序状态和关键变量的值
断点调试法
在开发环境中的对应代码行加上断点
当程序运行到断点行时,程序暂停运行
需要时可加上条件断点,当条件满足时才暂停程序的运行
- 图形用户界面由不同的窗口和窗口组件构成
- < QtGui >头文件包含窗口组件,对应Qt中的GUI模块
- Qt以组件对象的方式构建图形用户界面
- 组件的类型:
- 容器类(父组件):用于包含其它的界面组件
- 功能类(子组件):用于实现特定的交互功能
Qt中没有父组件的顶级组件叫做窗口
QLabel用于显示一个提示性的字符串
QLabel是功能性组件,一般需要父组件作为容器
QWidget w;
QLabel l(&w);
l.setText("This is a Label control.");
坐标系统
图形界面程序在坐标系统中进行窗口和部件的定位
定位类型
- 顶级窗口部件的定位
- 窗口内部件的定位
- 窗口部件的大小设置
Qt使用统一的坐标系统定位窗口部件的位置和大小
Qt部件类提供了成员函数在坐标系统中进行定位
QWidget类提供了窗口部件所需的坐标系统成员函数
QWidget类中的坐标系统成员函数
- x() y() width() height()
- geometry()
- x() y() width() height()
- frameGeometry()
- x() y() width() height()
geometry()和frameGeometry()中的几何数据必须在show()调用后才有效
QPushButton用于接受用户点击事件
QPushButton能够显示提示性字符串
QPushButton是功能性组件,需要父组件作为容器
QPushButton能够在父组件中进行定位
QWidget w;
QPushButton b(&w);
b.setText("Button");
b.move(10,10);
b.resize(100,25);
Qt的几何坐标以左上角为原定
- 水平为x轴,从左向右为正向
- 垂直为y轴,从上到下为正向
消息处理
Qt中定义了与系统消息相关的概念
- 信号(Signal)
- 由操作系统产生的消息
- 槽(Slot)
- 程序中的消息处理函数
- 连接(Connect)
- 将系统消息绑定到消息处理函数
信号与槽连接必须发生在两个Qt类对象之间
自定义槽
- 只有QObject的子类才能自定义槽
- 定义槽的类必须在声明的最开始处使用Q_OBJECT
- 类中声明槽时需要使用slots关键字
- 槽与所处理的信号在函数签名上必须一致
- SIGNAL和SLOT所指定的名称中:
- 可以包含参数类型
- 不能包含具体的参数名
Qt中的字符串类
- 采用Unicode编码
- 使用隐式共享技术来节省内存和不必要的数据拷贝
- 跨平台使用,不必考虑字符串的平台兼容性
Qt对象间可以存在父子关系
- 每一个对象保存有它所有子对象的指针
- 每一个对象都有一个指向其父对象的指针
当Qt对象销毁时
- 将自己从父对象的Children List移除
- 将自己的Children List中的所有对象销毁
使用Qt开发时,不仅要时刻注意内存泄露的问题,还要时刻关注对象是否可能被多次销毁的问题
对话框及其类型
模态对话框(QDialog::exec())
- 显示后无法与父窗口进行交互
- 是一种阻塞式的对话框调用方式
非模态对话框(QDialog::show())
- 显示后独立存在可以同时与父窗口进行交互
- 是一种非阻塞式的对话框调用方式
小技巧:
- 在栈上创建模态对话框是最简单常用的方式
- 一般情况下非模态对话框需要在堆上创建
- 通过QDialog::setModal函数可以创建混合特性的对话框
- 非模态对话框需要制定Qt::WA_DeleteOnClose属性
对话框的返回值
- 只有模态对话框才有返回值的概念
- 模态对话框的返回值用于表示交互结果
- QDialog::exec()的返回值为交互结果
- void QDialog::done(int i)关闭对话框并将参数作为交互结果
- QDialog::Accepted-用户操作成功
- QDialog::Rejected-用户操作失败
登录对话框
登录对话框需求分析
- 可复用软件部件
- 获取用户名和密码
附加需求
- 随机验证码
Qt中的标准对话框
Qt中的标准对话框遵循相同的使用方式
// 定义对话框对象
DialogType dlg(this);
// 设置对话框属性
dlg.setPropertyXXX(value);
if(dlg.exec() == DialogType::Value)
(
获取对话框数据
Type v = dlg.getDialogValue();
处理对话框数据
)
消息对话框是应用程序中最常见的界面元素
消息对话框主要用于
- 为用户提示重要信息
- 强制用户进行操作选择
文件对话框常用于
Open Mode
- 应用程序中需要用户打开一个外部的文件
Save Mode
- 应用程序中需要将当前内容存储于用户指定的外部文件中
文件类型过滤器
- 在文件对话框中可以通过文件后缀定义过滤器
- 过滤定义规则:
- 显示名(.后缀1 .后缀2 … *.后缀N)
- 例如:”Image(.png .xpm *.jpg)”
- “Text(*.txt)”
颜色对话框
- Qt中提供了预定义的颜色对话框QColorDialog类
- QColorDialog类用于提供指定颜色的对话框部件
输入对话框
- Qt中提供了预定义的输入对话框QInputDialog类
- QInputDialog类用于需要临时进行数据输入的场合
布局管理器
QFormLayout
QBoxLayout
- QVBoxLayout
- QHBoxLayout
QGridLayout
QStackedLayout:栈式布局管理器
- 所有组件垂直于屏幕的方向上被管理
- 每次只有一个组件会显示在屏幕上
- 只有最顶层的组件会被最终显示
计时器是工程开发中非常重要的角色
计时器用于每隔一定的时间触发一个消息
计时器消息最终会被转化为函数调用
宏观上,计时器在每个时间间隔会调用指定的函数
计时器(QTimer)的使用方法
- 编写计时器消息处理函数
- 在程序中创建计时器对象
- 连接计时器消息和消息处理函数
- 设置计时器时间间隔并启动计时
应用程序中的主窗口
- 主窗口是与用户进行长时间交互的顶层窗口
- 程序的绝大多数功能直接由主窗口提供
- 主窗口通常是应用程序启动后显示的第一个窗口
- 整个程序由一个主窗口和多个对话框组成
QMainWindow是Qt中主窗口的基类
QMainWindow继承于QWidget是一种容器类的组件
QMainWindow中封装的秘密
- 菜单栏
- 工具栏
- 中心组件
- 停靠组件
- 状态栏
在Qt中提供与菜单相关的类组件
- 菜单栏(QMenuBar)
- 下拉菜单组(QMenu)
- 菜单项(QAction)
在Qt主窗口中创建菜单
QmenuBar* mb = menuBar();
QMenu* menu = new QMenu("File(&F)");
QAction* action = new QAction("New", NULL);
menu->addAction(action);
mb->addMenu(menu);
主窗口的概念和意义
- 应用程序中集成各种功能实现快捷使用的一个区域
- 工具栏并不是应用程序中必须存在的组件
- 工具栏中的元素可以是各种窗口组件
- 工具栏的元素通常以图标按钮的方式存在
在Qt中提供与工具栏相关的类组件
- 工具栏(QToolBar)
- 快捷项(QAction)
在Qt主窗口中创建工具栏
QToolBar* tb = addToolBar("Tool Bar");
QAction* action = new QAction("", NULL);
action->setToolTip("Open");
action->setIcon(QIcon(":/Res/open.png"));
tb->addAction(action);
QToolBar的关键成员函数
- void setFloatable(bool floatable)
- void setMovable(bool movable)
- void setIconSize(const QSize& iconSize)
主窗口中的状态栏
- 应用程序中输出简要信息的区域
- 一般位于主窗口的最底部
在Qt主窗口创建状态栏
QStatusBar* sb = statusBar();
QLabel* l = new QLabel("Label");
QLineEdit* e = new QLineEdit();
sb->addPermanentWidget(l);
sb->addPermanentWidget(e);
sb->showMessage("D.T.Software");
Qt状态栏的设计原则
- 左边的区域用于输出实时消息
- 右边的区域用于设置永久消息
- addWidget在状态栏左半部分添加组件
- addPermanentWidget在状态栏右半部分添加组件
Qt中的文本编辑组件
- QLineEdit
- 单行文本编辑组件
- QTextEdit
- 多行富文本编辑组件
- QPlainTextEdit
- 多行普通文件编辑组件