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();elseQMessageBox::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));}
}
欢迎大家一起交流。