一、常用类
1. QString 字符串类(掌握)
QString是Qt中的字符串类,使用Unicode编码,而不是ASCII码。在C++中字符使用8位的char类型表示一个字符,但是在Qt中使用16位的QChar表示一个字符。因此Qt处理中文没有任何问题,并且一个汉字算作一个字符。
QString类整体使用与std::string类似,但是在API上有所不同。
常用函数如下:
- QString QString::number(int n, int base = 10) [static]
数字→字符串
参数1:要转换的数字
参数2:进制
- QString & QString::setNum(int n, int base = 10)
数字→字符串,支持链式调用
参数1:要转换的数字
参数2:进制
- int QString::toInt(bool * ok = 0, int base = 10) const
字符串→数字
参数1:转换的结果,成功或失败
参数2:进制
返回值:转换的结果,数字;如果失败,返回0。
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QString str = "你好吗αβγāáǎàあいうㅞㅝ";
qDebug() << str.size();
for(int i=0;i<str.size();i++)
{
qDebug() << str.at(i);
}
// 判断字符串是否为空
qDebug() << str.isEmpty();
str.append("fdf");
qDebug() << str;
// 基于16进制转换
int i = 16;
qDebug() << QString::number(i,16);
// 支持链式调用的转换
qDebug() << str.setNum(255,16).prepend("0x");
str = "0";
bool result; // 转换成功或失败的结果
// QString → int
int m = str.toInt(&result,10);
if(result)
qDebug() << "转换成功:" << m;
else
qDebug() << "转换失败:" << m;
}
Dialog::~Dialog()
{
delete ui;
}
2. 容器类(掌握)
Qt重新实现了C++中的容器类,这些容器类比C++中STL的容器类更加轻巧、安全和易于使用,使用Qt的容器类可以减少可执行文件的大小,Qt的容器类是线程安全的,在基本兼容C++的容器类接口的基础上拓展了新的接口。
分别以QList和QMap为例,进行顺序容器和关联容器的讲解。
2.1 QList
自定义一个C++类,作为QList的元素类型。
下面是创建自定义的C++类的步骤:
1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。
2. 在弹出的窗口中,按照下图所示进行操作。
3. 在弹出的窗口中,输入类名后点击“下一步”。
4. 在项目管理界面,直接点击“完成”。可以看到项目中多了新创建的类的头文件和源文件。
QList<Student>示例代码下载链接:https://pan.baidu.com/s/18mb6AsT8mqRcTDrzkAj5-Q
提取码:hqyj
--来自百度网盘超级会员V6的分享
需要注意的是,QStringList类型基本等同QList<QString>,后面不再赘述。
2.2 QMap
示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
3. 跨平台数据类型(了解)
Qt是一个跨平台的开发框架,为了确保在各个平台上的数据类型具有同一的长度,Qt为各种常用的基本数据类型定义了类型符号。
除此之外,Qt中还有一个通用数据类型QVariant,可以对常见的Qt数据类型进行相互转换,也可以使用QVariant类型作为中间类型间接转换不同数据类型。
4. 时间和日期处理(掌握)
Qt拥有若干时间和日期相关类型,本次使用QDateTime类进行讲解。
QDateTime类常用函数如下所示。
- qint64 QDateTime::currentMSecsSinceEpoch() [static]
返回1970年1月1日 0点0分0秒到现在的毫秒数
- QDateTime QDateTime::currentDateTime() [static]
返回一个基于当前时区的时间和日期信息的QDateTime对象
- QString QDateTime::toString(const QString & format) const
返回一个自定义格式的时间日期字符串
参数是自定义的时间和日期格式。
时间和日期相关组件:
示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
5. QTimer 定时器类(掌握)
定时器类QTimer主要有两个功能:
- 周期性执行某个动作
- 延迟一段时间后执行某个动作
QTimer类与之前的QButtonGroup一样,需要手动控制堆内存对象的创建和销毁。
QTimer的常用属性如下所示。
- interval : int
如果是一次性的定时器,此属性表示延迟执行的时间;
如果是周期性的定时器,此属性表示间隔执行的时间。
时间单位毫秒。
- singleShot : bool
此属性表示定时器是否是一次性,如果不是一次性就是周期性。
QTImer的常用函数如下所示。
- void QTimer::start() [slot]
开始或重新开始定时器,如果定时器已经在运行,则会停止运行后再次运行。
- void QTimer::stop() [slot]
停止运行
- void QTimer::timeout() [signal]
定时器出发时发射的信号
示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
二、多窗口编程
1. 消息对话框 QMessageBox(掌握)
QDialog是一个对话框窗口类,Qt为了方便程序员调用各种功能的对话框窗口,预设了很多QDialog的派生类,这些派生类分别应用于不同的场景。
这些派生类往往都通过一个静态成员函数调用,通常不需要使用构造函数创建对象。根据不同窗口的功能,这些静态函数会提供当前窗口的信息作为返回值。
QMessageBox是一个用于展示信息或询问用户一个问题的模态对话框,预设的类型有四种:
展示QMessageBox的静态成员函数如下所示。
函数名称可以更换为question、information、warning。
参数1:父对象
参数2:窗口标题
参数3:窗口信息
返回值:用户在弹窗中点击的按钮
2. 常见窗口类的继承关系(掌握)
QWidget类本身也可以创建对象,其构造函数如下所示。
- QWidget::QWidget(QWidget * parent = 0)
如果parent参数使用默认值,QWidget对象就是一个独立的窗口;
如果parent参数不使用默认值,QWidget对象会成为其父窗口对象内部的组件。
QMainWidow类通常作为主窗口,因为此类可以增加菜单栏、工具栏、状态栏等。
QWidget类内部也有一些所有的窗口类共有的成员,例如:
- windowTitle : QString
窗口标题
- windowFlags : Qt::WindowFlags
窗口标记
- void QWidget::setWindowState(Qt::WindowStates windowState)
设置窗口状态
示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
3. 主窗口类 QMainWindow(掌握)
QMainWindow作为窗口类,包含以下几个部分:
QMenuBar作为菜单栏,内部可以包含若干个菜单QMenu。
QMenu作为菜单,内部可以放置直接触发的QAction对象,也可以继续放置子菜单QMenu,形成二级或多级折叠的菜单。
上面的对象都是肉眼可见的,因此都属于ui指针管理。
QAction的常用信号如下所示。
- void QAction::hovered() [signal]
当鼠标悬停在QAction上发射此信号。
- void QAction::triggered(bool checked = false) [signal]
QAction直接或间接点击触发后发射的信号。
QAction的属性可以在Designer的Action编辑器面板配置,也可以在C++代码中配置。
工具栏上的工具按钮,实际上就是QAction,只需要给QAction设置图标后,在Designer中拖拽上去即可。
中心组件可以包含子组件,是窗口的主要展示内容,可以当做是一个QDialog,与之前的使用无异。
状态栏QStatusBar用于显示一些当前应用程序的状态信息,常用函数如下。
- void QStatusBar::showMessage(const QString & message, int timeout = 0) [slot]
在状态栏展示信息。
参数1:信息内容。
参数2:信息展示的时长,单位毫秒,默认值表示持续显示。
- void QStatusBar::clearMessage() [slot]
清空状态栏显示内容
示例代码下载链接:https://pan.baidu.com/s/1KDJBxLhlnOvpmyfllgMlIg
提取码:hqyj
--来自百度网盘超级会员V6的分享
4. parent参数(掌握)
在Qt各个类的构造函数中经常可以看到parent参数,parent参数传入的对象会作为新创建对象的父对象。对于组件和窗口类,子对象和父对象之间的从属关系比较清晰,例如窗口对象中的组件对象。但是一些非组件或窗口类(例如 QButtonGroup、QTimer等)也有parent参数来设置父对象。
实际上parent参数是Qt内存管理的一个重要环节。
当一个对象创建时设定了父对象,则这个新创建的对象会跟随父对象销毁。Qt中的堆内存对象通常都要传递parent参数,栈内存对象则可以不传递,因为栈内存对象会在局部代码执行完成自动销毁。
堆内存对象创建时不传递parent参数时,需要手动delete,以防止内存泄漏。
示例代码下载链接:https://pan.baidu.com/s/1v3-4eMfIHz-fpCYRSdse1Q
提取码:hqyj
--来自百度网盘超级会员V6的分享
5. 自定义窗口类(掌握)
创建一个自定义的Qt窗口类的步骤如下所示:
1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。
2. 在弹出的窗口中,按照下图所示进行操作。
3. 在弹出窗口中,按照下图所示进行操作。
4. 在弹出的窗口中,为新创建的窗口类命名,注意不要使用已经存在的类名。
5. 在项目管理界面,直接点击“完成”。可以看到项目中多了新创建的界面类文件。
示例代码下载链接:https://pan.baidu.com/s/15AUvrSfSAFW1Q0zrdAcC9w
提取码:hqyj
--来自百度网盘超级会员V6的分享
三. 参数传递(掌握)
3.1 主窗口 → 子窗口
主窗口可以通过调用子窗口公开的函数,实现参数传递的效果。
【例子】在主窗口中转动QDial,子窗口的QDial同步转动。
示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
3.2 子窗口 → 主窗口
子窗口可以通过发射带参数的信号给主窗口接收,实现参数传递的效果。
【例子】在子窗口中转动QDial,主窗口的QDial同步转动。
示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
4. 事件机制(掌握)
事件机制是Qt内部的一种消息的传递方式,Qt程序在运行的过程中,不断地处理和转发各种事件信息。
以用户操作鼠标为例:
事件的传递检测可以通过对应类型的事件函数,常用的事件函数如下所示。
void QWidget::paintEvent(QPaintEvent * event) [virtual protected] 绘制
void QWidget::resizeEvent(QResizeEvent * event) [virtual protected] 大小改变
void QWidget::mousePressEvent(QMouseEvent * event) [virtual protected] 鼠标按压
void QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual protected] 鼠标释放
void QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual protected] 鼠标双击
void QWidget::mouseMoveEvent(QMouseEvent * event) [virtual protected] 鼠标移动
void QWidget::moveEvent(QMoveEvent * event) [virtual protected] 移动
void QWidget::keyPressEvent(QKeyEvent * event) [virtual protected] 按键按压
void QWidget::keyReleaseEvent(QKeyEvent * event) [virtual protected] 按键释放
void QWidget::focusInEvent(QFocusEvent * event) [virtual protected] 获得焦点
void QWidget::focusOutEvent(QFocusEvent * event) [virtual protected] 失去焦点
void QWidget::closeEvent(QCloseEvent * event) [virtual protected] 关闭
void QWidget::enterEvent(QEvent * event) [virtual protected] 鼠标进入
void QWidget::leaveEvent(QEvent * event) [virtual protected] 鼠标离开
事件函数的使用步骤如下:
1. 找到对应的事件函数
2. 在头文件中声明事件函数
3. 在源文件中定义事件函数
QPainter类是画家类,可以绘制很多底层显示的效果,常用函数如下:
- QPainter::QPainter(QPaintDevice * device)
构造函数,参数是被绘制的对象,只有QPaintDevice的派生类才能被绘制。
- void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap & pixmap)
画图
参数1:横坐标
参数2:纵坐标
参数3:宽度
参数4:高度
参数5:绘制内容
QKeyEvent类是按键事件的类型,其对象携带了按键事件的相关信息,需要使用的函数如下:
- int QKeyEvent::key() const
返回当前激发的按键码,按键码的对应表查阅Qt文档。
事件函数示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
在父组件中可以使用事件过滤器检测事件在子组件的传递过程。
【例子】窗口中有两个QLineEdit,当焦点离开第一个QLineEdit时,窗口背景设置为黑色;当焦点进入第一个QLineEdit时,窗口背景设置为白色。
1. 给需要监控的子组件注册事件过滤器
void QObject::installEventFilter(QObject * filterObj)
参数为父组件
2. 在父窗口中覆盖eventFilter函数
bool QObject::eventFilter(QObject * watched, QEvent * event) [protected virtual]
参数1:被监控的对象,本例中为第一个QLineEdit
参数2:事件对象
返回值:是否拦截
事件过滤器示例代码下载链接:https://pan.baidu.com/s/1sUlfJkUXbw-RweJ8q09K8w
提取码:hqyj
--来自百度网盘超级会员V6的分享