逆枫゛

Qt学习群:1149411109 群文件提供博客源码,定期答疑、更新学习资料。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1,简介

之前介绍了QTreeView的初始化和常用设置,现在数据已经显示出来了。

那么QTreeView上如何处理选中、单击双击、右键菜单等操作呢?

本文介绍选中信号的处理。


2,选中相关信号

QTreeView的选中内容由一个封装的QItemSelectionModel管理,通过QTreeView接口selectionModel()可以取得该Model指针。

该Model存在这些信号:

Q_SIGNALS:
    void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
    void currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
    void currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous);
    void currentColumnChanged(const QModelIndex ¤t, const QModelIndex &previous);
    void modelChanged(QAbstractItemModel *model);

一般如果设置选中模式为单个元素,那么使用currentChanged信号即可;

如果是单行,那么使用currentRowChanged信号即可;

如果是多选,一般使用selectionChanged信号。

其他不常用,使用方法类似,根据情况选用。


3,槽函数处理


1,定义对应的槽函数(这里3个信号都处理,是为了演示用法,实际一般只处理其中一种信号)

private:
    void slotSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
    void slotCurrentChanged(const QModelIndex ¤t, const QModelIndex &previous);
    void slotCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous);

2,绑定信号

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    InitTree();

    connect(ui->treeView->selectionModel(),&QItemSelectionModel::selectionChanged,this,&MainWindow::slotSelectionChanged);
    connect(ui->treeView->selectionModel(),&QItemSelectionModel::currentChanged,this,&MainWindow::slotCurrentChanged);
    connect(ui->treeView->selectionModel(),&QItemSelectionModel::currentRowChanged,this,&MainWindow::slotCurrentRowChanged);
}

3,槽函数实现

//选中内容变化,覆盖单选和多选的情况
void MainWindow::slotSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
    QItemSelectionModel *selections = ui->treeView->selectionModel();
    QModelIndexList indexes = selections->selectedIndexes();    //得到所有选中的index
    foreach(QModelIndex index, indexes)
    {
        //从索引index获取item指针,mModel是tree的数据Model,这里是QStandardItemModel*类型
        QStandardItem* item = mModel->itemFromIndex(index);
        if (item)
        {
            //你的操作,比如取文本、取附带的data
//            QString text = item->text();
//            QString data1 = item->data(Qt::UserRole + 1).toString();
//            QString data2 = item->data(Qt::UserRole + 2).toInt();
        }
    }
}

//当前选中index变化,单个
void MainWindow::slotCurrentChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
    QStandardItem* item = mModel->itemFromIndex(current);
    if (item)
    {
        //你的操作,同上
    }
}

//当前选中行变化,单行
void MainWindow::slotCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
    //取选中的这行的第一个元素的index
    QModelIndex index = current.sibling(current.row(),0);
    QStandardItem* item = mModel->itemFromIndex(index);
    if(item)
    {
        //你的操作,同上
    }
}


posted on 2018-04-25 00:54  逆枫゛  阅读(1679)  评论(0编辑  收藏  举报