13.4.1 获取与监视选择范围

2013-10-07 15:18:35 · 作者: · 浏览: 67

13.4.1  获取与监视选择范围

视图类将多个数据项呈现给用户后,用户常常会选择其中一些数据项,并要求应用程序对这些数据项施加某种操作。这种情形下,应用程序应该能够查询到哪些数据项被选中了。每个视图对象包含一个QItemSelectionModel对象,调用后者的selectedIndexes()成员函数,可以返回上述信息。

有些情形下,应用程序需要监视用户的选择操作。每当用户选择或者取消选择某些数据项时,应用程序立即会执行某些动作。例如,用户在使用Windows操作系统的资源管理器时,屏幕下方的状态栏会显示被选中文件的个数、总字节数。每当用户选择或者取消选择某些文件,状态栏中的数据会立即更新。每个视图对象所包含的QItemSelectionModel对象负责监视用户的选择操作。每当用户选择或者取消选择某些数据项,该对象会触发一个selectionChanged()信号。应用程序把这个信号与某个槽函数绑定,就可以及时处理用户的选择或者取消选择操作。

我们举一个具体的例子来说明如何读取与监视用户所做的选择或者取消选择操作。如 图13 18所示,该例子显示一个8行、4列的表格。初始时所有数据项内容为空。每当用户选择某个或者某些数据项,每个数据项的行号、列号会被显示在该数据项所在位置。每当用户取消选择某个或者某些数据项,这些数据项中的内容会恢复为空。窗口的标题显示有多少个数据项被选中,每当用户执行一个选择或者取消选择操作,这个标题会被立即更新。

 
图13 18  读取与监视选择范围

例子中的窗口由类MainWindow实现,其声明如代码段13 16所示。类型为QStandardItemModel的成员负责管理例子中8行、4列的数据项,类型为QTableView的成员负责显示这些数据项。该类并没有定义一个QItemSelectionModel对象,因为将来创建QTableView对象时,必定会有这样一个对象被创建。该类定义了一个槽函数updateSelection(),该槽函数将与QItemSelectionModel对象的selectionChanged()信号绑定,以处理用户的选择或者取消选择操作。

代码段13 16,类MainWindow的声明,取自z:\examples\mvc\selection_monitoring\mainwindow.h

  1. class MainWindow : public QMainWindow{  
  2.     ……  
  3. private slots:   
  4.     void updateSelection(const QItemSelection &selected, const  QItemSelection &deselected);  
  5. private:  
  6.     QStandardItemModel  * model;  
  7.     QTableView * tableView;  
  8. };    

类MainWindow的实现如代码段13 17所示。其构造函数将QItemSelectionModel对象的selectionChanged()信号与类MainWindow的槽函数updateSelection()绑定。一旦用户选择或者取消选择了一些数据项,该槽函数会被执行。该函数的参数selected表示用户刚刚选择了哪些数据项,参数deselected表示用户刚刚取消选择了哪些数据项。调用这两个参数的成员函数indexes()(行①、③),可以获得对应数据项的索引的列表,该列表的类型为QModelIndexList,等价于QList<QModelIndex>。由于是一个QList,所以行②、④可以使用foreach关键字遍历列表。

代码段13 17,类MainWindow实现,取自z:\examples\mvc\selection_monitoring\mainwindow.cpp

  1. MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)  
  2.     : QMainWindow(parent, flags)  
  3. {  
  4.     model     = new QStandardItemModel(8, 4, this);  
  5.     tableView = new QTableView(this);  
  6.     tableView->setModel(model);  
  7.     QItemSelectionModel * selectionModel = tableView->selectionModel();  
  8.     connect(selectionModel, SIGNAL( selectionChanged(QItemSelection,    QItemSelection) ),  
  9.         this,           SLOT  ( updateSelection (QItemSelection,            QItemSelection) ) );   
  10.     resize(600,400);  
  11.     setCentralWidget(tableView);  
  12. }  
  13. void MainWindow::updateSelection(const QItemSelection &selected,const   QItemSelection &deselected)  
  14. {  
  15.       QModelIndexList items = selected.indexes();       ①  
  16.       QModelIndex index;  
  17.       foreach (index, items) {                      ②  
  18.             QString text = QString("(%1,%2)")  
  19.          .arg( index.row() + 1 ).arg( index.column() + 1 );  
  20.             model->setData(index, text);  
  21.       }  
  22.       items = deselected.indexes();                 ③  
  23.       foreach (index, items)                            ④  
  24.             model->setData(index, "");  
  25.  
  26.       QItemSelectionModel * selectionModel = tableView->selectionModel();  
  27.       QModelIndexList whole_list = selectionModel->selectedIndexes();⑤  
  28.       setWindowTitle( QString("%1 item selected")  
  29.         .arg( whole_list.size() ) );  
  30. }  

以上调用的类QItemSelection的成员函数indexes()只能返回用户刚刚选择或者取消选择的数据项的索引。为了返回所有被选择数据项的索引,行⑤调用视图对象所包含的QItemSelectionModel对象的selectedIndexes()函数。