View Module
listView QStringListModel
tableView QStandardItemModel QItemSelectionModel
treeView QFileSystemModel
  • View 都是通过 setModel() 来绑定模型。
  • 我们只需要把数据绑定到Model上就可以了,不同的view使用不同的model,如上图。
  • 获取View中的item,是使用 QModelIndex 来获取 index, 然后使用 itemFromIndex。
  1. QModelIndex index = theModel->index(row, column);
  2. QStandardItem *item = theModel->itemFromIndex(index);
  3. item->setData("内容", Qt::DisplayRole);

1. treeView -> QFileSystemModel

  1. fileModel = new QFileSystemModel(this);
  2. fileModel->setRootPath(QDir::currentPath());
  3. ui->treeView->setModel(fileModel);
  4. ui->listView->setModel(fileModel);
  5. ui->tableView->setModel(fileModel);

2. listView -> QStringListModel

  • setStringList(): 初始化数据模型的字符串列表的内容
  • 提供编辑和修改字符串列表数据的函数:

    • insertRows()
    • removeRows()
    • setData()

显示加载数据:

  1. QStringListModel *theModel = new QStringListModel(this);
  2. QStringList strList;
  3. for (int i=0; i<6; i++) {
  4. strList.append(QString::asprintf("item %d", i));
  5. }
  6. theModel->setStringList(strList);
  7. ui->listView->setModel(theModel);
  8. // 可以让listview单元格可编辑
  9. ui->listView->setEditTriggers(QAbstractItemView::DoubleClicked
  10. | QAbstractItemView::SelectedClicked);

在已有的列表中新加一项:

  1. int lastRow = theModel->rowCount(); // 获取最后一项的row
  2. theModel->insertRow(lastRow); // 在最后一项添加一个新item
  3. QModelIndex idx = theModel->index(lastRow, 0); // 获取这个row的index
  4. theModel->setData(idx, "new item", Qt::DisplayRole); // 设置值
  5. ui->listView->setCurrentIndex(idx); // 设置最后一项被选中

在被选中的地方插入新item:

  1. // 先在model中增加一个item
  2. QModelIndex index = ui->listView->currentIndex(); // 获取被选择中的row的index
  3. theModel->insertRow(index.row()); // 插入一个新item
  4. // 再设置这个item的值
  5. theModel->setData(index, "insert item", Qt::DisplayRole); // 设置值
  6. ui->listView->setCurrentIndex(index); // 设置该item被选中

删除被选中的:

  1. theModel->removeRow(ui->listView->currentIndex().row());

清除所有项:

  1. theModel->removeRows(0, theModel->rowCount());

3. tableView -> QStandardItemModel

项数据为基础的标准数据模型类,通常与QTableView组合成MV结构,实现通用的二维数据的管理功能。

  • 处理二维数据
  • 每个项是一个QStandardItem,用于存储项的:

    • 数据
    • 字体
    • 对齐

QItemSelectionModel: 跟踪view组件的单元格选中状态的类,通过它可以获得选中的单元格的模型索引。

初始化model并绑定到view:

  1. theModel = new QStandardItemModel(10, 4, this); // 初始化10行4列的model
  2. theSelection = new QItemSelectionModel(theModel); // 绑定select到model
  3. ui->tableView->setModel(theModel); // 绑定view
  4. ui->tableView->setSelectionModel(theSelection); // 绑定view
  5. // 添加选择后的事件
  6. connect(theSelection, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
  7. this, SLOT(on_currentChanged(QModelIndex,QModelIndex)));
  1. void MainWindow::on_currentChanged(const QModelIndex &current, const QModelIndex &previous)
  2. {
  3. Q_UNUSED(previous);
  4. if (!current.isValid()) return;
  5. labCellPos->setText(QString::asprintf("当前单元格: %d行,%d列", current.row(), current.column()));
  6. // 获取被选中的item
  7. QStandardItem *item = theModel->itemFromIndex(current);
  8. labCellText->setText("单元内容:" + item->text());
  9. QFont font = item->font();
  10. ui->actFontBold->setChecked(font.bold());
  11. }

绑定数据与model:

  • content: 是一个二维的 QStringList,第一行是标题,每列之间是\t\t
  1. 测深(m) 总位移(m) 固井质量 测井取样
  2. 252 0.51 1
  3. 275 0.72 1
  4. 325 1.09 1
  5. 350 1.27 一般 0
  6. 375 1.45 一般 0
  1. void MainWindow::initModelFromStringList(QStringList &content)
  2. {
  3. theModel->setRowCount(content.count() - 1); // 设置表有多少行
  4. // 设置表头
  5. QString header = content.at(0);
  6. QStringList headerList = header.split(QRegExp("\\s+"), QString::SkipEmptyParts);
  7. theModel->setHorizontalHeaderLabels(headerList);
  8. // 设置表格数据
  9. QStandardItem *item;
  10. for (int i=1; i<content.count(); i++) {
  11. QString lineText = content.at(i);
  12. QStringList itemList = lineText.split(QRegExp("\\s+"), QString::SkipEmptyParts);
  13. for (int j=0; j<itemList.count(); j++) {
  14. item = new QStandardItem(itemList.at(j));
  15. if (j == (FixedColumnCount-1)) {
  16. // 最后一列是checkbox
  17. item->setText(headerList.at(j));
  18. item->setCheckable(true);
  19. if (itemList.at(j) == "1")
  20. item->setCheckState(Qt::Checked);
  21. else
  22. item->setCheckState(Qt::Unchecked);
  23. }
  24. theModel->setItem(i-1, j, item); // 因为去掉了表头,所以减1
  25. }
  26. }
  27. }

添加一行:

  1. QList<QStandardItem *> itemList;
  2. QStandardItem *item;
  3. for (int i=0; i<FixedColumnCount; i++) {
  4. item = new QStandardItem();
  5. if (i == FixedColumnCount - 1) {
  6. item->setText(theModel->horizontalHeaderItem(i)->text());
  7. item->setCheckable(true);
  8. item->setCheckState(Qt::Checked);
  9. } else
  10. item->setText(QString::asprintf("new %d", i));
  11. itemList.append(item);
  12. }
  13. theModel->appendRow(itemList);
  14. // 设置选中的行
  15. theSelection->clearSelection();
  16. theSelection->setCurrentIndex(theModel->index(item->row(), 0), QItemSelectionModel::Select);

插入一行:

  1. QModelIndex curIndex = theSelection->currentIndex();
  2. QStandardItem *curItem = theModel->itemFromIndex(curIndex);
  3. int curRow = curItem->row();
  4. QList<QStandardItem *> itemList;
  5. QStandardItem *item;
  6. for (int i=0; i<FixedColumnCount; i++) {
  7. item = new QStandardItem();
  8. if (i == FixedColumnCount - 1) {
  9. item->setText(theModel->horizontalHeaderItem(i)->text());
  10. item->setCheckable(true);
  11. item->setCheckState(Qt::Checked);
  12. } else
  13. item->setText(QString::asprintf("new %d", i));
  14. itemList.append(item);
  15. }
  16. theModel->insertRow(curRow, itemList);
  17. theSelection->clearSelection();
  18. theSelection->setCurrentIndex(theModel->index(item->row(), 0), QItemSelectionModel::Select);

删除一行:

  1. QModelIndex curIndex = theSelection->currentIndex();
  2. theModel->removeRow(curIndex.row());
  3. // 最后一行不设置选中状态
  4. if (curIndex.row() < theModel->rowCount())
  5. theSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);

设置选中的item的字体样式:

  1. if (!theSelection->hasSelection()) return;
  2. auto selectedIndexes = theSelection->selectedIndexes();
  3. for (int i=0; i<selectedIndexes.count(); i++) {
  4. auto index = selectedIndexes.at(i);
  5. QStandardItem *item = theModel->itemFromIndex(index);
  6. QFont font = item->font(); // 字体bold
  7. font.setBold(checked);
  8. item->setFont(font);
  9. item->setTextAlignment(Qt::AlignLeft); // 左对齐
  10. }