Qt SQLite的创建和使用

重点:

1.SQLite创建数据库内容方法

链接:SQLite Expert Personal的简单使用-CSDN博客

2.和数据库进行链接方法

cpp 复制代码
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关系

cpp 复制代码
/打开数据表
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);	//"数据过滤"分组框
}

4.设置设置自定义代理组件

cpp 复制代码
 //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); //设置代理组件
相关推荐
2501_941111343 小时前
C++中的策略模式高级应用
开发语言·c++·算法
心软小念3 小时前
用Python requests库玩转接口自动化测试!测试工程师的实战秘籍
java·开发语言·python
sanggou4 小时前
【Python爬虫】手把手教你从零开始写爬虫,小白也能轻松学会!(附完整源码)
开发语言·爬虫·python
普通网友5 小时前
C++与Qt图形开发
开发语言·c++·算法
yue0085 小时前
C# 更改窗体样式
开发语言·c#
普通网友5 小时前
C++中的适配器模式
开发语言·c++·算法
风闲12175 小时前
Qt源码编译记录
开发语言·qt
普通网友5 小时前
C++中的委托构造函数
开发语言·c++·算法
月上柳青6 小时前
OpenWrt系统上配置batman-adv快速开始与配置详解
开发语言·mysql·php
全栈陈序员6 小时前
基于Rust 实现的豆瓣电影 Top250 爬虫项目
开发语言·爬虫·rust