QItemSelectionModel
Qt的MVC结构支持多个View共享同一个model,包括该model的选中状态等。我们可以通过设置QItemSelectionModel,来更改View的选中效果和显示效果。我们创建一个Qt Application项目,在MainWindow的头文件中添加一个QTbaleView*
类型的成员 _table_view。然后在构造函数中为这个_table_view设置model
1 | MainWindow::MainWindow(QWidget *parent) : |
我们创建了一个QStandardItemModel对象,然后为其设置几个Item,最后将这个model设置到tableview中。
我们可以为TableView设置选择的项目,接下来继续在构造函数中补充
1 | //获取视图的项目选择模型 |
我们从tableview中获取选择模型,然后从根节点下选择第1行1列作为左上索引,选择第5行2列作为右下索引。然后创建选择区域QItemSelection,最后将选择区域这只给选择模型。接下来为了我们为工具栏添加两个动作,为动作绑定两个槽函数,在MainWindow声明文件中添加两个函数的声明
1 | public slots: |
在构造函数中将动作和槽函数绑定起来
1 | ui->mainToolBar->addAction(tr("当前项目"), this, &MainWindow::getCurrentItemData); |
实现这两个槽函数, getCurrentItemData获取当前条目的数据信息,toggleSelection实现切换选择的条目
1 | void MainWindow::getCurrentItemData(){ |
通过点击切换选择,可以实现选择区域的切换,因为我们设置选择的类型为Toggle,系统会将选中的变为取消选中,将取消选中的变为选中。
切换前
切换后
因为默认当前的条目是第1行1列,所以getCurrentItemData会打印他的信息。每一个model都有当前条目和选择条目两个属性。
捕获选择条目的变化
当我们点击鼠标选择一个条目时,当前条目就变为该条目,选择的条目也变为该条目。我们可以通过选择模型发出的selectionChanged信号,获取选择了那些条目的索引,以及取消选择了哪些条目的索引。我们可以通过currentChanged获取当前的条目索引以及变化之前的条目索引。现在MainWindow中添加两个槽函数的声明
1 | public slots: |
两个槽函数的参数和信号的参数匹配。我们实现changeCurrent,当选择模型的当前索引变化时,打印变化前后的索引行号,列号。
1 | void MainWindow::changeCurrent(const QModelIndex& current, const QModelIndex& previous){ |
然后我们实现选择模型的选择条目变化时更新条目的数据
1 | void MainWindow::updateSelection(const QItemSelection& selected, const QItemSelection& deselected){ |
在MainWindow的构造函数中添加信号和槽函数的链接
1 | //选择模型的选择条目更改后触发updateSelection函数 |
点击某个条目,其他条目的数据都变为空,这个条目被选中,内容修改为行列号
多个View共享模型
MVC结构最大的好处就是可以通过多个View共享同一个model,这个model的选中状态改变时,多个View的显示效果一致。
在构造函数中添加另一个QTableView
1 | QTableView * tableView2; |
可以看到两个View显示的选中状态是一致的