GUI 应用程序是由事件 (event)驱动的。点击鼠标,按下按键,窗口大小改变等等。

QT 的事件系统

按事件的来源,可以将事件划分为 3 类:

  • 自生事件(spontaneous event):由窗口系统产生,如 QKeyEventQMouseEvent。自生事件会进入系统队列,等待事件循环的处理。
  • 发布事件(posted event):是由 qt 应用程序产生,如:QTimerEvent。使用 QCoreApplication::postEvent() 产生发布事件,等等事件循环的处理。
  • 发送事件(sent event):有 QT 或其他程序定向发送的事件。使用 QCoreApplication::sendEvent() 产生发送事件,有对象的 event() 函数直接处理。

qt 的主事件循环 QCoreApplication::exec() 从事件队列中获取原生的系统事件,将它们转为 QEvent,并将转换后的事件发送给 QObject。任何 QObject 派生的类都可以算是是事件。

QWidget 类重新实现了函数 event(),并针对一些典型类型的事件定义了专门的事件处理函数。要对一些典型事件进行处理,只需重新实现这些事件处理函数即可。

事件与信号

  • 界面组件类的很多俣可以看作是对某些事件的封装,例如 QPushButtonclicked() 信号,可以看做是对 QEvent::MouseButtonRelease 类型事件的封装。
  • 但是 Qt 的界面组件只是将少数事件封装成了信号。例如,QLabel 就没有与鼠标双击事件对应的信号。可以从 QLabel 派生一个类,把鼠标双击事件转换为发射一个自定义信号 doubleClicked()。即,将 mouseDoubleClicked 事件封装为 doubleClicked() 信号/

事件过滤器

  • 事件过滤器是 QObject 提供的一种处理事件的方法
    • 它将一个对象的事件委托给另一个对象来监视并处理

拖放事件与拖放操作

拖放时,相当于操作 MIME 数据

  • QMimeData 用于可存储在剪贴板中的信息,并支持通过拖放机制传输。
  • QMimeData 对象将它们所持有的数据与相应的 MIME 类型相关联,以确保信息可以在应用程序内,应用程序之间安全传输。

具有拖放功能的组件

  • QAbstractItemView 类定义了拖放操作相关的各种函数,通过这些函数的设置,QListViewQTableViewQTreeView 及其对应的便利类都具有非常方便的节点拖放操作功能。

模型/视图结构概述

  • 数据(data):如数据库的一个数据表或 SQL 查询结果,内存中的一个字符串,或磁盘文件结构等。
  • 模型(model):与数据通信,并为视图组件提供数据接口。
  • 视图(view): 是屏幕上的界面组件,视图从数据模型获得每个数据项的模型索引,通过模型索引获取数据
  • 代理(delegate):在视图与模型之间交互操作时提供的临时编辑器。模型项视图提供数据是单身的,一般仅用于显示。当需要在视图上编辑数据时,代理会为需要编辑的数据提供一个编辑器。

模型,视图和代理之间使用信号与槽通信。

  • 所有基于项(item)的模型类都基于 QAbstractItemModel (其父类是 QObject)
  • 模型只是在内存中临时存储数据,模型的数据来源可以是其他类,数据库等

视图组件:显示数据时,只需要调用视图类的 setModel() 函数

便利类:QListWidgetQTableWidgetQTreeWidget

  • 视图组件不存储数据
  • 便利类则为组件的每个节点或单元格创建一个项用项存储数据,格式设置等。
  • 便利类没有数据模型,将界面与数据绑定了。
  • 便利类缺乏对大型数据源进行灵活处理的能力,适用于小型数据的和显示和编辑。

代理

  • 代理就是在视图组件上为编辑数据提供编辑器
    • 如在表格组件中编辑一个单元格的数据同时,缺省是使用一个 QLineEdit 编辑框。代理负责从数据模型获取相应的数据,然后显示在编辑器里,修改数据后,又将其保存到数据模型中。
  • QAbstractItemDelegate 是所有代理类的基类。

索引

数据模型中存储数据的基本单元都是项(item),每个项有一个年号,一个万列号,还有一个父项

项的角色:在为数据模型的一个项设置数据时,可以赋予其不同项的角色的数据。

QStringListModelQListView

QStringListModel 是处理字符串列表的模型类,其实例可以作为 QListView 组件的数据模型。这两个类结合构成模型/视图结构,可以在界面上显示和编辑字符串列表。

  • setStringList() 将模型的内部字符串列表设置为一组字符串。模型将通知任何附着的视图其基础数据已更改。
  • 提供编辑和修改字符串列表数据的函数,如 insertRows()removeRows()setData()

自定义代理

  • 在模型/视图结构中,代理的作用就是在视图组件进入编辑状态编辑某个项时,提供一个临时的编辑器用于数据编辑,默认的代理编辑器是 QLIneEdit 编辑框

QWidget 是所有界面组件类的直接或间接父类。QWidget 的父类是 QObjectQPaintDevice

Widget 组件:所有界面组件的统称,它从操作系统接收鼠标,键盘和其他事件,并在屏幕上显示自己,每个组件都是矩形的,并且按 z 轴顺序排列。

window:没有嵌入到父组件中的组件。通常,有一个 frame 和一个标题栏,可以使用 window flags 创建没有这两个装饰的窗口。在 Qt 中,QMainWindowQDialog 的各种子类是最常用的 window 类型。

阅读全文 »

题目描述

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给定一个二叉树的根节点 root ,返回其 最大路径和,即所有路径上节点值之和的最大值。

题目来源:来源:力扣(LeetCode)

阅读全文 »

题目描述

设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

请实现 KthLargest 类:

  • KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
  • int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

题目链接

阅读全文 »
0%