QT--SQLite

配置类相关的表,所以我使用sqlite,且QT自带该组件;

1.安装 sqlite-tools-win-x64-3460000、SQLiteExpert5.4.31.575

使用SQLiteExpert建好数据库.db文件,和对应的表后把db文件放在指定目录 ./db/program.db;

2.选择sql组件

3.新增数据库处理类,在使用数据库的地方调用类成员函数即可

cpp 复制代码
DataModel::DataModel()
{
	db = QSqlDatabase::addDatabase("QSQLITE", "");
	db.setDatabaseName("./db/program.db");
    connectDataBase();
}

DataModel::~DataModel()
{
    disconnectDataBase();
}

// 打开数据库文件
bool DataModel::connectDataBase() {
    bool ret = db.open();
    if (!ret) {
        outPutMsg(QtDebugMsg, "DataModel::connectDataBase error = " + db.lastError().text());
    } 
    return ret;
}
// 关闭数据库文件
void DataModel::disconnectDataBase() {
    db.close();
}
QStringList DataModel::queryProgramList() {
    QStringList programList;
    // 根据名字查询
    QString sql = QString("select sectionBarName,programNo from program where 1=1;");
    outPutMsg(QtDebugMsg, "DataModel::queryProgramList sql = " + sql);
    // 创建一个可以对db执行语句的对象
    QSqlQuery query(db);
    // 执行sql语句
    bool ret = query.exec(sql);
    if (!ret)
    {
        outPutMsg(QtDebugMsg, "DataModel::queryProgramNo error = " + query.lastError().text());
        return programList;
    }

    // 行坐标向下移
    while (query.next())
    {
        //获取数据库query所指的那行的数据
        QString program;
        program += (query.value(0).toString() + ";"); // sectionBarName
        program += QString::number(query.value(1).toInt()); // programNo

       // outPutMsg(QtDebugMsg, "DataModel::queryProgramInfoBySectionCode programInfo = " + program);
        programList.append(program);
    }
    return programList;
}
// 根据型材代号查询程序号码
QString DataModel::queryProgramNo(QString sectionBarNo) {
    // 根据名字查询
    QString sql = QString("select programNo from program where sectionBarName=\'%1\';").arg(sectionBarNo);
    //QString sql = QString("select programNo from program where 1=1");
    outPutMsg(QtDebugMsg, "DataModel::queryProgramNo sql = " + sql);
    // 创建一个可以对db执行语句的对象
    QSqlQuery query(db);
    // 执行sql语句
    bool ret = query.exec(sql);
    if (!ret)
    {
        outPutMsg(QtDebugMsg, "DataModel::queryProgramNo error = " + query.lastError().text());
        return "";
    }
    QString programNo = "";
    // 行坐标向下移
    while (query.next())
    {
        //获取数据库query所指的那行的数据
        programNo = QString::number(query.value(0).toInt());
        outPutMsg(QtDebugMsg, "DataModel::queryProgramNo programNo = " + programNo);
    }
    return programNo;
}

// 根据程序号码查询
QString DataModel::queryProgramByNo(QString programNo) {
    // 根据名字查询
    QString sql = QString("select sectionBarName from program where programNo=\'%1\';").arg(programNo);
    //QString sql = QString("select programNo from program where 1=1");
    outPutMsg(QtDebugMsg, "DataModel::queryProgramByNo sql = " + sql);
    // 创建一个可以对db执行语句的对象
    QSqlQuery query(db);
    // 执行sql语句
    bool ret = query.exec(sql);
    if (!ret)
    {
        outPutMsg(QtDebugMsg, "DataModel::queryProgramByNo error = " + query.lastError().text());
        return "";
    }
    QString sectionBarNo = "";
    // 行坐标向下移
    while (query.next())
    {
        //获取数据库query所指的那行的数据
        sectionBarNo = QString::number(query.value(0).toInt());
        outPutMsg(QtDebugMsg, "DataModel::queryProgramByNo sectionBarNo = " + sectionBarNo);
    }
    return sectionBarNo;
}


// 根据型材代号查询程序号码
QStringList DataModel::queryProgramInfoBySectionCode(QString sectionBarNo) {
    QStringList programInfoList;
    // 根据名字查询
    // 使用索引sectionBarName
    QString sql = QString("select stepNo, cutNo,x, y, f, Rx, Ry from programInfo where programNo = (select programNo from program where sectionBarName=\'%1\');").arg(sectionBarNo);
    //QString sql = QString("select programNo from program where 1=1");
    outPutMsg(QtDebugMsg, "DataModel::queryProgramInfoBySectionCode sql = " + sql);
    // 创建一个可以对db执行语句的对象
    QSqlQuery query(db);
    // 执行sql语句
    bool ret = query.exec(sql);
    if (!ret)
    {
        outPutMsg(QtDebugMsg, "DataModel::queryProgramInfoBySectionCode error = " + query.lastError().text());
        return programInfoList;
    }
    // 行坐标向下移
    while (query.next())
    {
        //获取数据库query所指的那行的数据
        QString programInfo;
         
        programInfo += (QString::number(query.value(0).toInt())+";"); // stepNo
        programInfo += (QString::number(query.value(1).toInt())+";"); // cutNo
        programInfo += (QString::number(query.value(2).toDouble(), 'f', 2) + ";"); // x
        programInfo += (QString::number(query.value(3).toDouble(), 'f', 2) + ";"); // y
        programInfo += (QString::number(query.value(4).toDouble(), 'f', 2) + ";"); // f 速度
        programInfo += (QString::number(query.value(5).toDouble(), 'f', 2) + ";"); // Rx
        programInfo += (QString::number(query.value(6).toDouble(), 'f', 2)); // Ry
        
        outPutMsg(QtDebugMsg, "DataModel::queryProgramInfoBySectionCode programInfo = " + programInfo);
        programInfoList.append(programInfo);
    }
    return programInfoList;
}

// 更新程序信息
bool DataModel::updateProInfosByProNo(QString proNo, QStringList proInfoList) {
    // 开启事务
    if (!db.transaction()) {
        outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo db.error = " + db.lastError().text());
        return false;
    }

    QStringList programInfoList;
    // 根据名字查询
    // 使用索引sectionBarName
    QString sqlDel = QString("delete from programInfo where programNo=\'%1\';").arg(proNo);
    outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo sqlDel = " + sqlDel);
    // 创建一个可以对db执行语句的对象
    QSqlQuery query(db);
    // 执行sql语句
    bool ret = query.exec(sqlDel);
    if (!ret)
    {
        outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo error = " + query.lastError().text());
        return false;
    }
    try {
        for (int i = 0; i < proInfoList.size(); i++) {
            QStringList programInfo = proInfoList.at(i).split(";");
            QString sqlOne = "insert into programInfo values ( " + proNo + ",";

            for (int j = 0; j < programInfo.size(); j++) {
                if (j > 0) {
                    sqlOne += ",";
                }
                sqlOne += programInfo.at(j) ;
            }
            sqlOne += ");";
            outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo sqlOne = " + sqlOne);
            if (!query.exec(sqlOne))
            {
                outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo error = " + query.lastError().text());
                return false;
            }
        }
    }
    catch (...) {
        outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo error = " + query.lastError().text());
        return false;
    }

    
    // 开启事务
    if (!db.commit()) {
        outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo db.error = " + db.lastError().text());
        return false;
    }

    return true;
}
cpp 复制代码
// 保存程序信息
void ClearCorner::on_edit_saveBtn_clicked() {
    QStringList proInfoList;
    for (int i = 0; i < modelProgram.rowCount(); i++) {
        QString strTmp;
        for (int j = 0; j < modelProgram.columnCount(); j++) {
            QStandardItem* item = modelProgram.item(i, j);
            if (j > 0) {
                strTmp += ";";
            }
            strTmp += item->text();
        }
        outPutMsg(QtDebugMsg, "ClearCorner::on_edit_saveBtn_clicked strTmp = " + strTmp);
        proInfoList.append(strTmp);
    }
    DataModel dataModel;
    bool ret = dataModel.updateProInfosByProNo(ui.edit_lineEdit_programNo->text(), proInfoList);
    if (ret) {
        QMessageBox::information(nullptr, "提示", "更新程序成功!");
    }
    else {
        QMessageBox::warning(nullptr, "提示", "更新程序失败!");
    }
}
相关推荐
机器视觉知识推荐、就业指导6 小时前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt
doll ~CJ9 小时前
可视化工具箱-Visualization Toolkit(VTK)
qt·vtk_9.1.0·release_x64
霍霍哈嗨11 小时前
【QT基础】创建项目&项目代码解释
开发语言·qt
Eoneanyna12 小时前
QT设置git仓库
开发语言·git·qt
神仙别闹13 小时前
基于Python+SQLite的课程管理系统
数据库·sqlite
少年负剑去13 小时前
django分发路由
数据库·django·sqlite
飞翔的佩奇13 小时前
xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
数据库·spring boot·mysql·sqlite·xxl-job·任务调度
Langneer16 小时前
Qt 状态机编程,双层状态机,实现暂停恢复
开发语言·qt
三玖诶16 小时前
如何在 Qt 的 QListWidget 中为某一行添加点击事件
开发语言·qt
InJre16 小时前
QT widgets 窗口缩放,自适应窗口大小进行布局
开发语言·qt·ui