• 2388阅读
  • 2回复

[提问]在QTableView中修改不了QSqltablemodel绑定的mysql数据库内容 [复制链接]

上一主题 下一主题
离线simomli
 

只看楼主 倒序阅读 楼主  发表于: 2020-01-04
QTableView作为视图,QSqltablemodel作为模型,模型绑定的是mysql数据库表,在QTableView视图修改模型数据,不能修改mysql数据表的内容,如果模型绑定的是Sqlite数据,可以直接修改,这是为什么?

  1. QSqlDatabase  m_db = QSqlDatabase::addDatabase("QSQLITE");
  2. m_db.setDatabaseName("E:/2020-01-02_3340112000000282env_12.db");
  3. if(m_db.open()){
  4.     model = new QSqlTableModel(this,m_db);
  5.     model->setEditStrategy(QSqlTableModel::OnFieldChange);
  6.     model->setTable("batLog");
  7.     model->select();
  8. }
  9. ui->tableView->setModel(model);
  10. //这样可以直接在tableview修改db的数据
  11. QSqlDatabase  m_db = QSqlDatabase::addDatabase("QMYSQL");
  12. m_db.setHostName("127.0.0.1");
  13. m_db.setDatabaseName("btkjdb");
  14. m_db.setPort(3306);
  15. m_db.setUserName("root");
  16. m_db.setPassword("123456");
  17. model = new QSqlTableModel(this);
  18. model->setTable("station_compartment_status_t");
  19. model->setEditStrategy(QSqlTableModel::OnManualSubmit);
  20. model->select();
  21. ui->tableView->setModel(model);
  22. void MainWindow::on_pushButton_clicked(){
  23.     model->database().transaction();
  24.     if(model->submitAll()){
  25.         qDebug()<<"1111" << model->lastError();
  26.         model->database().commit();
  27.     }else{
  28.         qDebug()<<"2222" <<model->lastError();
  29.     }
  30. }

离线liudianwu

只看该作者 1楼 发表于: 2020-01-05
你写错了,还一句没写,你没有提交数据库事务。
model->database().transaction();
if (model->submitAll()) {
    model->database().commit();      
} else {
    model->database().rollback();        
}
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线simomli

只看该作者 2楼 发表于: 2020-01-06
回 liudianwu 的帖子
liudianwu:你写错了,还一句没写,你没有提交数据库事务。
model->database().transaction();
if (model->submitAll()) {
    model->database().commit();      
} else {
....... (2020-01-05 09:25) 

恩,之前不能修改是因为mysql表的编码有问题,现在可以修改了。
另外,请教下,在QML里面用的是gridview作为视图,Qsqltablemodel作为模型,数据库还是用mysql,当在视图上修改了数据后,怎么设置到mysql,重新实现了,rolenames及setdata函数,比如:现在需要修改其中一个roles的值,在qml中,直接给对应的roles赋值,但是没写成功,

setEditStrategy(QSqlTableModel::OnFieldChange);

QHash<int, QByteArray> ftsqltablemodel::roleNames() const
{
    QHash<int, QByteArray> roles;
    for (int i = 0; i < this->record().count(); i ++) {
       roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
       qDebug() << "roles:" << record().fieldName(i).toUtf8();
    }
    return roles;
}

bool ftsqltablemodel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    bool ret = false;
    if (index.isValid()) {
        if (role < Qt::UserRole) {
            QSqlTableModel::setData(index, value,role);
            ret = true;
        } else {
            int columnIdx = role - Qt::UserRole - 1;
            QModelIndex modelIndex = this->index(index.row(), columnIdx);
            if(QSqlTableModel::setData(modelIndex, value,role))
            {
                qDebug()<< "edit " << modelIndex.row() << modelIndex.column() << value;
                ret = true;
            }
            else{
                qDebug()<< "edit failed " << modelIndex.row() << modelIndex.column() << value;
            }
        }
    }
    qDebug()<<"555555" << index.row() << index.column() << value << role;
    return ret;
}

QML:
            MouseArea{
                anchors.fill:parent
                onClicked:{
                    model.MinCellVoltage = 4.2
                }
            }

想请教下,在QML里面,怎么对模型数据的修改更新到mysql数据库中
快速回复
限100 字节
 
上一个 下一个