QT: QTableview(02)如何获取某一行一列的数据



文章目录

  • QT: QTableview(02)如何获取某一行一列的数据
  • 前言
  • 一、显示数据库数据
  • 二、取出单条数据



前言

提示:这里可以添加本文要记录的大概内容:

但凡要用到数据库的系统,基本少不了QTableView,这套MVC的机制在QT中能够应用娴熟,对我们的开发效率提高大有裨益。这里我们来看看它的具体用法;


提示:以下是本篇文章正文内容,下面案例可供参考

一、显示数据库数据

1、连接数据库
2、声明QSqlTableModel实例对象,并绑定数据表
3、设置QTableView绑定的SqlTableModel

代码如下(示例):

QSqlTableModel model = new QSqlTableModel(this);
model->setTable("users");
model->select();
ui->tableView->setModel(model);

// 显示设置
model->setHeaderData(0, Qt::Horizontal, "姓名");
model->setHeaderData(1, Qt::Horizontal, "年龄");
model->setHeaderData(3, Qt::Horizontal, "民族");
model->setHeaderData(2, Qt::Horizontal, "描述");

ui->tableView->setColumnWidth(0, 60);
ui->tableView->setColumnWidth(1, 60);
ui->tableView->setColumnWidth(2, 60);
ui->tableView->setColumnWidth(3, 80);

二、取出单条数据

1、有关model的data函数

取出TableView的数据,很关键的一个函数就是model提供的data(QModelIndex &index)函数。用官方的解释来讲model->data()的作用是“返回QModelIndex处的相应角色的值”。基本上所有的model都支持这个函数。

python QTableWidget数据导出csv qtablewidget获取行数据_数据

函数原型如下:

QVariant  TradeTableModel::data ( const QModelIndex & index, int role /*= Qt::DisplayRole*/ ) const
{
	if(!index.isValid() ||  index.row() >=m_OrderList.size() || m_OrderList.isEmpty())
	{
		Q_ASSERT(false);
		 return QVariant();
	}

	switch(role)
	{
		case Qt::DisplayRole:    //显示文字
		case Qt::EditRole:
		{
			QVariant varHeader = headerData(index.column(),  Qt::Horizontal , Qt::UserRole);
			return GetIndexData(index, varHeader);
		}
	}
}

有了这个data函数,我们直接可以输出我们选中的单元格的信息啦。如

QString name = model->data(index).toString();
      qDebug()<<"name +"<<name;

或者,更直接的用具体的行列来指定单元格

QString name = model->data(model->index(2,1)).toString();
      qDebug()<<"name +"<<name;

上面的model即为声明的QSqlTableModle,index为一个QModelIndex 。

2、如何获得QModelIndex

a、通过控件本身自带的函数如click(),doubleclick(),press(),自身的参数如:

on_tableView_pressed(const QModelIndex &index)

b、通过tableView控件提供的currentIndex(),调用这样

QModelIndex index=ui->tableView->currentIndex()

c、还可以通过QSqlTableModel的 的实例对象提供的index(int row,int col)方法获取,如

QModelIndex index=model->index(0,1);

如果我们获取某TableView背后选择的model不方便(可能这个model就是一个局部变量),那么也不要着急,可以通selectionModel()来获取model

QModelIndex sindex = ui->tableView->selectionModel()->currentIndex();

3、在TableView自带事件中取出一条记录

QModelIndex pindex;
QString pstr ;
for(int i=0;i<model->columnCount();i++)
{
	pindex = model->index(index.row(),i);
	pstr = model->data(pindex).toString();
	qDebug()<<"data is: +"<<pstr;
}

说明:
a、如果我们是通过TableView本身的事件来取出记录,那么系统会自动传递给事件一个QModelIndex 类型的参数index,上面程序的index.row(),这个index就是事件的参数,这里的index包含了。
b、从代码运行的效果知每一个QModelIndex 变量都包含了具体到某行某列的信息,及一个数对,行与列的数对(row,column)。
c、当我们在自定义函数中也需要获取某一条记录,没有这个index参数怎么办呢?答案是自己创建,通过tableView->currentIndex()创建,

4、在定义函数中取出一条记录

代码如下:

QModelIndex cindex = ui->tableView->currentIndex();
QModelIndex pindex;
QString pstr ;
for(int i=0; i < model->columnCount(); i++)
{
	pindex = model->index(cindex.row(), i);
	pstr= model->data(pindex).toString();
	qDebug()<<"data is: +"<<pstr;
}

上述代码中的cindex就是我们通过控件本身currentindex()来获取的QModelIndex ;
我们会发现这里有两个QModelIndex 类型的变量,他们是性质上毫无差别,实际我们只是用了第一个QModelIndex 定位了行(cindex.row()),同时用变量i确定其列数,那么再通过data函数就取出数据来了。