查看完整版本: [-- 在QTableView中修改不了QSqltablemodel绑定的mysql数据库内容 --]

QTCN开发网 -> Qt基础编程 -> 在QTableView中修改不了QSqltablemodel绑定的mysql数据库内容 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

simomli 2020-01-04 20:09

在QTableView中修改不了QSqltablemodel绑定的mysql数据库内容

用QTableView作为视图,QSqltablemodel作为模型,模型绑定的是mysql数据库表,在QTableView视图修改模型数据,不能修改mysql数据表的内容,如果模型绑定的是Sqlite数据,可以直接修改,这是为什么?

  1. QSqlDatabase  m_db = QSqlDatabase::addDatabase("QSQLITE");
    m_db.setDatabaseName("E:/2020-01-02_3340112000000282env_12.db");
    if(m_db.open()){
        model = new QSqlTableModel(this,m_db);
        model->setEditStrategy(QSqlTableModel::OnFieldChange);
        model->setTable("batLog");
        model->select();
    }
    ui->tableView->setModel(model);
    //这样可以直接在tableview修改db的数据
    QSqlDatabase  m_db = QSqlDatabase::addDatabase("QMYSQL");
    m_db.setHostName("127.0.0.1");
    m_db.setDatabaseName("btkjdb");
    m_db.setPort(3306);
    m_db.setUserName("root");
    m_db.setPassword("123456");
    model = new QSqlTableModel(this);
    model->setTable("station_compartment_status_t");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    ui->tableView->setModel(model);

    void MainWindow::on_pushButton_clicked(){
        model->database().transaction();
        if(model->submitAll()){
            qDebug()<<"1111" << model->lastError();
            model->database().commit();
        }else{
            qDebug()<<"2222" <<model->lastError();
        }
    }


liudianwu 2020-01-05 09:25
你写错了,还一句没写,你没有提交数据库事务。
model->database().transaction();
if (model->submitAll()) {
    model->database().commit();      
} else {
    model->database().rollback();        
}

simomli 2020-01-06 11:56
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数据库中


查看完整版本: [-- 在QTableView中修改不了QSqltablemodel绑定的mysql数据库内容 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled