view/model

main.cpp

#include "Mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
    MainWindow w;
     w.show();

    return a.exec();
}

Mainwindow.h


#include <QMainWindow>
#include <QMenuBar>
class QTableView;
class QItemSelection;
class QModelIndex;


class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

public slots:
void getCurrentItemData();
void toggleSelection();

void updateSelection(const QItemSelection &selected, const QItemSelection &deselected);
void changeCurrent(const QModelIndex &current, const QModelIndex &previous);

private:

QTableView *tableView;
QTableView *tableView2;
QMenuBar *mainToolBar;
};

 

 

Mainwindow.cpp


#include "mainwindow.h"

#include <QStandardItemModel>
#include <QTableView>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{


//******* 1. 选择模型的使用 ********//
//设置基础数据
QStandardItemModel *model = new QStandardItemModel(7, 4, this);
for (int row = 0; row < 7; ++row)
{
for (int column = 0; column < 4; ++column)
{
QStandardItem *item = new QStandardItem(QString("%1").arg(row * 4 + column));
model->setItem(row, column, item);
}
}

//设置视图并显示
tableView = new QTableView;
tableView->setModel(model);
setCentralWidget(tableView);

//获取视图的项目选择模型
QItemSelectionModel *selectionModel = tableView->selectionModel();

//使用索引创建选择
QModelIndex topLeft;
QModelIndex bottomRight;
topLeft = model->index(1, 1, QModelIndex());
bottomRight = model->index(5, 2, QModelIndex());
QItemSelection selection(topLeft, bottomRight);

//用指定的选择模式选择项目
selectionModel->select(selection, QItemSelectionModel::Select);


//******* 2. 获得选择项目、对选择项目进行反选 ********//

//向主窗口工具栏中添加两个动作图标
mainToolBar=new QMenuBar(this);
mainToolBar->addAction(tr("当前项目"), this, SLOT(getCurrentItemData()));
mainToolBar->addAction(tr("切换选择"), this, SLOT(toggleSelection()));


//******* 3. 选择项目改变时动态设置 ********//

//关联选择模型改变信号
connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection))
,this, SLOT(updateSelection(QItemSelection,QItemSelection)));

//关联选择项改变信号
connect(selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex))
,this, SLOT(changeCurrent(QModelIndex,QModelIndex)));

//***** 4. 当多个视图显示同一个模型的数据时,共享选择***//
tableView2 = new QTableView;
tableView2->setWindowTitle("tableView2");
tableView2->resize(400, 300);
tableView2->setModel(model);
tableView2->setSelectionModel(selectionModel);
tableView2->show();
}

MainWindow::~MainWindow()
{

delete tableView;
delete tableView2;
}

//输出当前项目的内容
void MainWindow::getCurrentItemData()
{
qDebug() << tr("当前项目的内容:")
<< tableView->selectionModel()->currentIndex().data().toString();
}

void MainWindow::toggleSelection()
{
QModelIndex topLeft = tableView->model()->index(0, 0, QModelIndex());
QModelIndex bottomRight = tableView->model()->index(tableView->model()->rowCount(QModelIndex()) - 1
,tableView->model()->columnCount(QModelIndex())-1
,QModelIndex());
QItemSelection curSelection(topLeft, bottomRight);
tableView->selectionModel()->select(curSelection, QItemSelectionModel::Toggle);
}

void MainWindow::updateSelection(const QItemSelection &selected, const QItemSelection &deselected)
{
QModelIndex index;
QModelIndexList list = selected.indexes();

//为现在选择的项目填充值
foreach (index, list)
{
QString text = QString("(%1, %2)").arg(index.row()).arg(index.column());
tableView->model()->setData(index, text);
}

//清空上一次选择的项目
list = deselected.indexes();
foreach(index, list)
{
tableView->model()->setData(index, "");
}
}

void MainWindow::changeCurrent(const QModelIndex &current, const QModelIndex &previous)
{
qDebug() << tr("move(%1, %2) to (%3, %4)")
.arg(previous.row()).arg(previous.column())
.arg(current.row()).arg(current.column());
}

 

posted @ 2020-12-27 12:37  deadwood_2016  阅读(60)  评论(0编辑  收藏  举报