zoukankan      html  css  js  c++  java
  • Qt 学习: 视图选择 (QItemSelectionModel)

    博主QQ:1356438802


     

    Qt 使用QItemSelectionModel类获取视图中项目的选择情况。这个模型保持有项目的索引。而且独立于不论什么视图。这意味着,我们能够让不同的视图共享同一个选择模型,从来达到一种同步操作的目的。选择由选择区域组成。模型仅仅将选区的開始和结束的索引位置记录下来,以保证对于非常大的选区也有非常好的性能。

    非连续选区则由多个连续选择组成。

    选择会直接应用于选择模型所维护的那些被选中的索引上面。最新的选择就是当前选择。这意味着。即便界面上没有显示有不论什么项目被选择。假设通过某些命令对选区进行操作,相同会有作用。

    在视图中,始终存在一个当前项和被选择项(即便从界面上看不到有不论什么选择)。与通常所想的不同,当前项和选择项是相互独立的两个状态。一个项目能够即是当前项又是选择项。下表是当前项和选择项的差别:

    当前项 选择项
    仅仅能有一个当前项。 能够有多个选择项。
    使用键盘或者鼠标点击能够改变当前项。 选择项使用两种状态:选择和未选择,这取决于项目之前的状态和其他一些设置。比如,单选或多选。仅仅有在用户进行交互的时候,这样的状态才会发生改变。
    当前项能够使用 F2 或者鼠标双击进行编辑(前提是程序同意)。

    当前项能够结合另外一个锚点指定被选择或者去除选择的一块选区(或二者的结合)。

    当前项一般会有一个焦点框进行标识。 选择项使用选区颜色进行标识。

    在处理选择的时候,我们能够将QItemSelectionModel当成数据模型中全部数据项的选择状态的一个记录。

    一旦选择模型创建好,这些数据项就能够在不知道哪些项被选择的情况下进行选择、取消选择或者改变选择状态的操作。全部被选择项的索引都在可随时更改,其他组件也能够通过信号槽机制改动这些选择的信息。


    标准视图类(QListViewQTreeView以及QTableView)已经提供了默认的选择模型,足以满足大多数应用程序的需求。

    某一个视图的选择模型能够通过selectionModel()函数获取,然后使用setSelectionModel()提供给其他视图共享,因此,一般没有必要新建选择模型。

    假设须要创建一个选区。我们须要指定一个模型以及一对索引,使用这些数据创建一个QItemSelection对象。这两个索引应该指向给定的模型中的数据,而且作为一个块状选区的左上角和右下角的索引。为了将选区应用到模型上。须要将选区提交到选择模型。

    这样的操作有多种实现,对于现有选择模型有着不同的影响。

    以下我们来看一些代码片段。首选构建一个总数 32 个数据项的表格模型,然后将其设置为一个表格视图的数据:

    在代码的最后,我们获得QTableView的选择模型,以备以后使用。

    如今,我们没有改动模型中的数据。而是选择表格左上角的一些单元格。以下我们来看看代码怎样实现:

    接下来,我们将获得的两个索引定义为选区。

    为达这一目的,我们首先构造一个QItemSelection对象,然后将其赋值给我们获取的选择模型:

    正如前面我们说的。首先利用左上角和右下角的坐标构建一个QItemSelection对象,然后将这个对象设置为选择模型的选择区。

    select()函数的第一个參数就是须要选择的选区,第二个參数是选区的标志位。

    Qt 提供了非常多不同的操作,能够參考下QItemSelectionModel::SelectionFlags的文档。在本例中,我们使用了QItemSelectionModel::Select,这意味着选区中所包括的全部单元格都会被选择。

    以下就是我们的执行结果:

    技术分享

    如今我们知道怎样设置选区。以下来看看怎样获取选区。

    获取选区须要使用selectedIndexes()函数。该函数返回一个无序列表。我们能够通过遍历这个列表获得哪些被选择:

    在选择发生更改时。选择模型会发出信号。我们能够连接selectionChanged()信号,在选区改变时检查哪个项目发生了变化。这个信号有两个參数:第一个是新选择的项目。第二个是刚刚被取消选择的项目。

    在以下的演示样例中。我们通过selectionChanged()信号,将全部新选择的项目填充字符串,将全部被取消选择的部分清空:

    通过currentChanged()。我们能够追踪当前有焦点的项。同selectionChanged()信号类似,这个信号也有两个參数:第一个是新的当前项,第二个是上一个当前项。

    以下的代码则是该信号的使用:

    这些信号能够用来监控选区的改变。假设你还要直接更新选区,我们还有另外的方法。

    相同是利用前面所说的QItemSelectionModel::SelectionFlag,我们能够对选区进行组合操作。

    还记得我们在前面的select()函数中使用过的第二个參数吗?当我们替换这个參数,就能够获得不同的组合方式。

    最经常使用的就是QItemSelectionModel::Select,它的作用是将全部指定的选区都选择上。

    QItemSelectionModel::Toggle则是一种取反的操作:假设指定的部分原来已经被选择,则取消选择,否则则选择上。

    QItemSelectionModel::Deselect则是取消指定的已选择的部分。在以下的样例中。我们使用QItemSelectionModel::Toggle对前面的演示样例作进一步的操作:

    执行结果将例如以下所看到的:

    技术分享

    默认情况下,选择操作会仅仅会影响到指定的模型索引。可是。我们也能够改变这一设置。比如,仅仅选择整行或者整列:

    上面的代码,我们依旧使用两个索引设置了一个区域。可是,在选择的使用我们使用了QItemSelectionModel::RowsQItemSelectionModel::Columns这两个參数。因此仅仅会选择这两个区域中指定的行或者列:

    技术分享

    使用QItemSelectionModel::Current參数能够将当前选区替换为新的选区。使用QItemSelectionModel::Clear则会将原来已有的选区所有取消。为了进行全选。我们能够设置选区为左上角和右下角两个索引:


  • 相关阅读:
    (转)python编写登录接口
    (转)Python之文件读写
    (转)python strip()函数 去空格 函数的用法
    (转)模块readline解析
    (转)跟着老男孩一步步学习Shell高级编程实战
    图片服务器优化 解决流量和存储问题
    某大型网站图片服务器改造方案
    雅虎网页优化14条原则
    独立的图片服务器架构
    城市分站设计思路
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7391024.html
Copyright © 2011-2022 走看看