Qt内存回收机制

在Qt中在堆上创建对象并且是QObject的子类(包含间接子类),构造方法传入父对象,创建时会把自己加入到父对象的children中,释放时先调用子对象的析构方法。

停靠窗口(Dock Widget)

docked:这个属性是否允许停靠窗口停靠

单行文本: LineEdit

弹簧:只有在布局中才能起作用,弹簧可以设置固定宽度,sizeType属性 expanding表示可以伸缩的 Fixed表示固定的

布局的 layoutSpacing属性表示两个空间之间的间隔,默认是6个像素

QPushButton使用

1 作为普通按钮,可以显示图标和文本

2 设置checkable属性,使其持续性处于被选中状态,开关

3 关联一个菜单, 点击按钮菜单弹出 setMenu(QMenu *menu); 倒三角图标

4 setDefault()绑定按钮和回车键,点击回车等同于点击按钮

设置QPushButton的点击动作两种方法:

1 使用可视化工具右键点击“转到槽”, 选中clicked

2 使用connect方法连接:

不可选中按钮

connect(ui->normalBtn, &QPushButton::clicked, this, [=]()
{
qDebug() << “我是一个普通按钮, 图标是小猪佩奇…”;
});

可选中按钮

connect(ui->checkedBtn, &QPushButton::toggled, this, [=](bool bl)
{
qDebug() << “我是一个checked按钮, 当前状态为:” << bl;
});

QToolButton与QPushButton 区别,关联菜单(QMenu)时,可以设置菜单的弹出方式

样式-英文 参数 样式-中文
color: white rgb(110,110,110) #eb7350 前景颜色,字体颜色
background: transparent 背景为透明
background-color: white rgb(110,110,110) #eb7350 背景颜色
background-position: left right center top bottom 设定图片的位置
background-image:url() ./img/back.jpg 背景图片 ,不缩放图片大小
border-image:url() ./img/back.jpg 背景图片,会对图片进行拉伸,平铺
border-style: outset inset 边框样式,按下是inset
border-width: px 边框大小
border-radius: px 边框弧度
border:3px solid red px color 边框宽度以及颜色
border-color: rgba(255, 225, 255, 30); color 边框颜色
font-family 微软雅黑 设定字体所属家族
font: bold 14px bold px 字体大小并加粗
font-size: px 字体大小
font-style: inset 字体样式
font-weight: px 字体深浅
selection-color: color 设定选中时候的颜色

QT事件处理

事件派发 -> 事件过滤->事件分发->事件处理

事件(event)是由系统或者 Qt 本身在不同的场景下发出的。当用户按下 / 移动鼠标、敲下键盘,或者是窗口关闭 / 大小发生变化 / 隐藏或显示都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如鼠标 / 键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

每一个 Qt 应用程序都对应一个唯一的 QApplication 应用程序对象,然后调用这个对象的 exec() 函数,这样 Qt 框架内部的事件检测就开始了(程序将进入事件循环来监听应用程序的事件)。

分发过程

1 当事件产生之后,Qt 使用用应用程序对象调用 notify() 函数将事件发送到指定的窗口

1
[virtual protected] bool QApplication::notify(QObject *receiver, QEvent *e);

2 事件在发送过程中可以通过事件过滤器进行过滤,默认不对任何产生的事件进行过滤。

1
2
 // 需要先给窗口安装过滤器, 该事件才会触发
[virtual protected] bool QObject::eventFilter(QObject *watched, QEvent *event);

3 当事件发送到指定窗口之后,窗口的事件分发器会对收到的事件进行分类:

1
[virtual protected] bool QWidget::event(QEvent *event);

4 事件分发器会将分类之后的事件(鼠标事件、键盘事件、绘图事件。。。)分发给对应的事件处理器函数进行处理,每个事件处理器函数都有默认的处理动作(我们也可以重写这些事件处理器函数),比如:鼠标事件:

1
2
3
4
5
6
// 鼠标按下
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);
// 鼠标释放
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);
// 鼠标移动
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event);

事件处理器函数

通过上面的描述可以得知:Qt 的事件处理器函数处于食物链的最末端,每个事件处理器函数都对应一个唯一的事件,这为我们重新定义事件的处理动作提供了便利。另外,Qt 提供的这些事件处理器函数都是回调函数,也就是说作为使用者我们只需要指定函数的处理动作,关于函数的调用是不需要操心的,当某个事件被触发,Qt 框架会调用对应的事件处理器函数。

QWidget 类是 Qt 中所有窗口类的基类,在这个类里边定义了很多事件处理器函数,它们都是受保护的虚函数。我们可以在 Qt 的任意一个窗口类中重写这些虚函数来重定义它们的行为。下面介绍一些常用的事件处理器函数:

鼠标事件

  • 鼠标按下事件

    当鼠标左键、鼠标右键、鼠标中键被按下,该函数被自动调用,通过参数可以得到当前按下的是哪个鼠标键

    1
    [virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);
  • 鼠标释放事件

    当鼠标左键、鼠标右键、鼠标中键被释放,该函数被自动调用,通过参数可以得到当前释放的是哪个鼠标键

    1
    [virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);
  • 鼠标移动事件

    当鼠标移动(也可以按住一个或多个鼠标键移动),该函数被自动调用,通过参数可以得到在移动过程中哪些鼠标键被按下了。

    1
    [virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event);
  • 鼠标双击事件

    当鼠标双击该函数被调用,通过参数可以得到是通过哪个鼠标键进行了双击操作。

    1
    [virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event);
  • 鼠标进入事件

    当鼠标进入窗口的一瞬间,触发该事件,注意:只在进入的瞬间触发一次该事件

    1
    [virtual protected] void QWidget::enterEvent(QEvent *event);
  • 鼠标离开事件

    当鼠标离开窗口的一瞬间,触发该事件,注意:只在离开的瞬间触发一次该事件

    1
    [virtual protected] void QWidget::leaveEvent(QEvent *event);

键盘事件

  • 键盘按下事件

    1
    [virtual protected] void QWidget::keyPressEvent(QKeyEvent *event);
  • 键盘释放事件

    1
    [virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event);

天气预报项目

1 qt中解析json数据

qt5.0开始提供对json的支持

json相关的类

QJsonObject

插入键值对: insert()方法

查询:contains() 方法 或 find()方法

大小: size()方法

QJsonArray

插入方法: append(const QJsonValue &value)方法 prepend(const QJsonValue &value)方法

insert(int position, const QJsonValue &value) 在positon之后插入

push_back(const QJsonValue &value)

push_front(const QJsonValue &value)

获取数据 count() size()

获取指定位置 at(int i)

删除指定位置 removeAt(int i)

QJsonValue

封装了六种qt的基本类型

QJsonValue::Bool

QJsonValue::Double

QJsonValue::String

QJsonValue::Array json数组

QJsonValue::Object json对象

QJsonValue::Null

构造QJsonValue

1
2
3
4
5
6
7
8
9
10
11
12
//字符串
QJsonValue(const char * s);
QJsonValue(const QString s);
//整形
QJsonValue(qint64 v);
QJsonValue(int v);
QJsonValue(double v);
//布尔类型
QJsonValue(bool b);
//json对象 json数组
QJsonValue(const QJsonObject b);
QJsonValue(const QJsonArray b);

QJsonDocument