但凡要用到数据库的系统,基本少不了QTableView,这套MVC的机制在QT中能够应用娴熟,对我们的开发效率提高大有裨益。这里我们来看看它的具体用法;
一、连接数据并显示
1、连接数据库(这步请参考我其他博文)
2、声明QSqlTableModel实例对象,并绑定数据表
3、设置TableView绑定的SqlTableModel
代码如下:
QSqlTableModel model=new QSqlTableModel(this);
model->setTable("tbCustom");
model->select();
ui->tableView->setModel(tmodel);
//显示设置
tmodel->setHeaderData(0, Qt::Horizontal, "姓名");
tmodel->setHeaderData(1, Qt::Horizontal, "身份证");
tmodel->setHeaderData(2, Qt::Horizontal, "单位");
tmodel->setHeaderData(3, Qt::Horizontal, "到访日");
tmodel->setHeaderData(4, Qt::Horizontal, "电话");
tmodel->setHeaderData(5, Qt::Horizontal, "地址");
ui->tableView->setColumnWidth(0, 60);
ui->tableView->setColumnWidth(1, 140);
ui->tableView->setColumnWidth(2, 32);
ui->tableView->setColumnWidth(3, 80);
ui->tableView->setColumnWidth(4, 90);
ui->tableView->setColumnWidth(5, 180);
二、取出单条数据
1、有关model的data函数
取出TableView的数据,很关键的一个函数就是model提供的data(QModelIndex &index)函数。用官方的解释来讲model->data()的作用是“返回QModelIndex处的相应角色的值”。基本上所有的model都支持这个函数
函数原型如下:
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);
//LOG4QT_TRADE_ERROR_PUT(tr("TradeTableModel::data 无效行"));
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函数就取出数据来了。
以上代码都通过实测通过,放心拷贝使用!