在QSqlTableModel中为UI值做单位转换



我子类化了QSqlTableModel并覆盖了data()和setData()来进行单位转换。也就是说,我想在进入db时将value乘以用户指定的乘数,并在UI中显示该字段时除以相同的乘数。但是,由于某种原因,除了最初填充字段之外,不会调用setData()。

结果:每次单击UI中的字段时,data()中的转换完成并将值分割,而无需在setData()中首先乘以它。反复点击该字段,该字段最终达到零值。

如果setData()被调用会有什么影响?

当我看到堆栈跟踪到达我的数据()时,似乎QSqlTableModel::setData每次都被调用,而不是我的函数。每次调用setData时,我都会提交()更改,因此这应该不是问题。

github存储库中的代码现在固定为按预期工作,根据解决方案。完整代码:https://github.com/savolai/qsqltablemodel_conversion_example

mainwindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// connect to db
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QSQLITE", "db");
db.setDatabaseName("db.sqlite");
if (!db.open()) {
    QMessageBox::critical(0, "Opening database failed",
        "Opening database failed. It really did.", QMessageBox::Close);
}
// connect model to db table table1
TableModel *model=new TableModel(this,db);
model->setTable("table1");
model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->select();
// add new record
QSqlRecord record;
QSqlField field0("radio", QVariant::Int);
field0.setValue(QVariant(QVariant::Int));
int fieldnumber=0;
record.insert(fieldnumber,field0);
int id=-1;
QSqlError error;
if(model->insertRecord(model->rowCount(),record)){
    if(model->submitAll()){
        id=record.value("id").toInt();
    }else{
        error=model->lastError();
        qDebug()<<error.text();
    }
}else{
    error=model->lastError();
    qDebug()<<error.text();
}
QDataWidgetMapper* mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
mapper->toLast();

mapper->addMapping(ui->lineEdit,model->fieldIndex("text"));


}

tablemodel.cpp:

TableModel::TableModel(QObject *parent, QSqlDatabase db)
    :    QSqlTableModel(parent,db)
{
}

bool TableModel::setData(const QModelIndex &index, QVariant &value, int role){
    double dValue=value.toDouble();
    double baseValue=dValue*2;
    bool success=QSqlTableModel::setData(index,QVariant(baseValue),role);
    emit dataChanged(index,index);
    return success;
}
QVariant TableModel::data(const QModelIndex &index, int role) const
{
    QVariant value=QSqlTableModel::data(index,role);
    double dValue=value.toDouble();
    double userValue=dValue/2;
    return QVariant(userValue);
}

你的setData原型与原来的不匹配。

你有

bool TableModel::setData(const QModelIndex &index, QVariant &value, int role)

而不是

bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)

最新更新