qt creator6.8
主要功能从数据库中读取数据,使用tableView进行显示。
qt框架中包含m/v结构 m指的是model(模型),v指的是view(视图)。这样可以使界面和数据分离开来。每当数据更新时,不会影响界面组件。
软件运行界面如下
程序分析window.h部分程序
private:
QSqlDatabase DB;//数据库连接
QSqlTableModel *tabModel;//数据模型
QItemSelectionModel *selectModel;//选择模型
QDataWidgetMapper *dataMapper;//数据映射
TComboBoxDelegate delegateSex;//自定义数据代理 性别
TComboBoxDelegate delegateDepart;//自定义数据代理 部门
void openTable();
void showRecordCount();
数显设置和数据库连接
void MainWindow::on_actOpenDB_triggered()
{
QString aFile=QFileDialog::getOpenFileName(this,"选择文件","","QSLite数据库(*.db3)");
if(aFile.isEmpty())
return;
DB=QSqlDatabase::addDatabase("QSQLITE");
DB.setDatabaseName(aFile);
if(DB.open())
openTable();
else
QMessageBox::warning(this,"错误","打开数据库失败");
}
数据库连接成功,数据读取后在tableview中和当前记录组件展示(tableView中性别和部门使用了代理类)。
void MainWindow::openTable()
{
tabModel =new QSqlTableModel(this,DB);//数据模型
tabModel ->setTable("employee");//设置数据表
tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
tabModel->setSort(tabModel->fieldIndex("empNo"),Qt::AscendingOrder);
if(!(tabModel->select()))
{
QMessageBox::critical(this,"错误信息","打开数据表错误,错误信息:\n"+tabModel->lastError().text());
return;
}
showRecordCount();//显示记录条数
//设置字段显示标题
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,"工资");
tabModel->setHeaderData(tabModel->fieldIndex("Memo"),Qt::Horizontal,"备注");
tabModel->setHeaderData(tabModel->fieldIndex("Photo"),Qt::Horizontal,"照片");
//创建选择模型
selectModel=new QItemSelectionModel(tabModel,this);
//行发生变化时
connect(selectModel,&QItemSelectionModel::currentChanged,this,&MainWindow::do_currentChanged);
connect(selectModel,&QItemSelectionModel::currentRowChanged,this,&MainWindow::do_currentRowChanged);
//model/View 结构
ui->tableView->setModel(tabModel);//设置数据模型
ui->tableView->setSelectionModel(selectModel);//设置选择模型
ui->tableView->setColumnHidden(tabModel->fieldIndex("Memo"),true);
ui->tableView->setColumnHidden(tabModel->fieldIndex("Photo"),true);
//为tableView中的性别和部门两个字段设置自定义代理组件
QStringList strList;
strList<<"男"<<"女";
delegateSex.setItem(strList,false);
ui->tableView->setItemDelegateForColumn(tabModel->fieldIndex("Gender"),&delegateSex);
strList.clear();
strList<<"技术部"<<"销售部"<<"市场部";
delegateDepart.setItem(strList,false);
ui->tableView->setItemDelegateForColumn(tabModel->fieldIndex("Department"),&delegateDepart);
//字段与widget映射
dataMapper=new QDataWidgetMapper(this);
dataMapper->setModel(tabModel);
dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
dataMapper->addMapping(ui->spinBoxEmpNo,tabModel->fieldIndex("empNo"));
dataMapper->addMapping(ui->lineEditName,tabModel->fieldIndex("Name"));
dataMapper->addMapping(ui->comboBoxSex,tabModel->fieldIndex("Gender"));
dataMapper->addMapping(ui->dateTimeEditBirth,tabModel->fieldIndex("Birthday"));
dataMapper->addMapping(ui->comboBoxProvince,tabModel->fieldIndex("Province"));
dataMapper->addMapping(ui->spinBoxSalary,tabModel->fieldIndex("Salary"));
dataMapper->addMapping(ui->comboBoxDep,tabModel->fieldIndex("Department"));
dataMapper->addMapping(ui->plainTextEdit,tabModel->fieldIndex("Memo"));
dataMapper->toFirst();
ui->actOpenDB->setEnabled(false);
ui->actAppend->setEnabled(true);
ui->actInsert->setEnabled(true);
ui->actDelete->setEnabled(true);
ui->actSave->setEnabled(true);
ui->groupBoxSort->setEnabled(true);
ui->groupBoxFilter->setEnabled(true);
ui->actAddMoney->setEnabled(true);
QSqlRecord emptyRec=tabModel->record();
for(int i=0;i<emptyRec.count();i++)
{
ui->comboBoxFiles->addItem(emptyRec.fieldName(i));
}
}
欢迎大家一起交流。