重点:
1.SQLite创建数据库内容方法
链接:SQLite Expert Personal的简单使用-CSDN博客
2.和数据库进行链接方法
QSqlDatabase DB; //数据库连接
bool MainWindow::openDatabase(QString aFile)
{
DB=QSqlDatabase::addDatabase("QSQLITE"); //添加 SQLITE数据库驱动
DB.setDatabaseName(aFile); //设置数据库名称
if (!DB.open()) //打开数据库失败
return false;
else
{
openTable(); //打开数据表
return true;
}
}
3.QTableView和QSqltableModedl、QItemSelectionModel关系
/打开数据表
void MainWindow::openTable()
{
//1. 创建数据模型,打开数据表
tabModel=new QSqlTableModel(this,DB); //数据模型
tabModel->setTable("employee"); //设置数据表
tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit); //数据保存方式,OnManualSubmit , OnRowChange
tabModel->setSort(tabModel->fieldIndex("empNo"),Qt::AscendingOrder); //排序
if (!(tabModel->select())) //查询数据失败
{
QMessageBox::critical(this, "错误信息",
"打开数据表错误,错误信息:\n"+tabModel->lastError().text());
return;
}
showRecordCount(); //显示记录条数
//2. 设置字段显示标题
tabModel->setHeaderData(tabModel->fieldIndex("empNo"), Qt::Horizontal, "工号");
tabModel->setHeaderData(tabModel->fieldIndex("Name"), Qt::Horizontal, "姓名");
tabModel->setHeaderData(tabModel->fieldIndex("Gender"), Qt::Horizontal, "性别");
tabModel->setHeaderData(tabModel->fieldIndex("Birthday"), Qt::Horizontal, "出生日期");
tabModel->setHeaderData(tabModel->fieldIndex("Province"), Qt::Horizontal, "省份");
tabModel->setHeaderData(tabModel->fieldIndex("Department"), Qt::Horizontal, "部门");
tabModel->setHeaderData(tabModel->fieldIndex("Salary"), Qt::Horizontal, "工资");
//这两个字段不在tableView中显示
tabModel->setHeaderData(tabModel->fieldIndex("Memo"),Qt::Horizontal,"备注");
tabModel->setHeaderData(tabModel->fieldIndex("Photo"),Qt::Horizontal,"照片");
//3. 创建选择模型
selModel=new QItemSelectionModel(tabModel,this); //关联选择模型
//当前行或列变化时发射currentChanged信号
connect(selModel,&QItemSelectionModel::currentChanged,
this,&MainWindow::do_currentChanged);
//当前行变化时发射currentRowChanged()信号
connect(selModel,&QItemSelectionModel::currentRowChanged,
this,&MainWindow::do_currentRowChanged);
//4. Model/View结构
ui->tableView->setModel(tabModel); //设置数据模型
ui->tableView->setSelectionModel(selModel); //设置选择模型
ui->tableView->setColumnHidden(tabModel->fieldIndex("Memo"),true); //隐藏列
ui->tableView->setColumnHidden(tabModel->fieldIndex("Photo"),true); //隐藏列
//5. 为tableView中的“性别”和“部门”两个字段设置自定义代理组件
QStringList strList;
strList<<"男"<<"女";
bool isEditable=false;
delegateSex.setItems(strList,isEditable);
ui->tableView->setItemDelegateForColumn(
tabModel->fieldIndex("Gender"),&delegateSex); //设置代理组件
strList.clear();
strList<<"销售部"<<"技术部"<<"生产部"<<"行政部";
isEditable=true;
delegateDepart.setItems(strList,isEditable);
ui->tableView->setItemDelegateForColumn(
tabModel->fieldIndex("Department"),&delegateDepart); //设置代理组件
//6. 创建界面组件与数据模型的字段之间的数据映射
dataMapper= new QDataWidgetMapper(this);
dataMapper->setModel(tabModel); //设置数据模型
dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit); //数据更新方式
//界面组件与数据模型的具体字段之间的联系
dataMapper->addMapping(ui->dbSpinEmpNo,tabModel->fieldIndex("empNo"));
dataMapper->addMapping(ui->dbEditName,tabModel->fieldIndex("Name"));
dataMapper->addMapping(ui->dbComboSex,tabModel->fieldIndex("Gender"));
dataMapper->addMapping(ui->dbEditBirth,tabModel->fieldIndex("Birthday"));
dataMapper->addMapping(ui->dbComboProvince,tabModel->fieldIndex("Province"));
dataMapper->addMapping(ui->dbComboDep,tabModel->fieldIndex("Department"));
dataMapper->addMapping(ui->dbSpinSalary,tabModel->fieldIndex("Salary"));
dataMapper->addMapping(ui->dbEditMemo,tabModel->fieldIndex("Memo"));
dataMapper->toFirst(); //移动到首记录
//7. 获取字段名称列表,填充groupBoxSort
getFieldNames();
//8.更新actions和界面组件的使能状态
ui->actOpenDB->setEnabled(false); //不能再打开数据库
ui->actRecAppend->setEnabled(true);
ui->actRecInsert->setEnabled(true);
ui->actRecDelete->setEnabled(true);
ui->actScan->setEnabled(true);
ui->groupBoxSort->setEnabled(true); //"排序"分租框
ui->groupBoxFilter->setEnabled(true); //"数据过滤"分组框
}