gpt4 book ai didi

c++ - 对 QSqlTableModel 中的 UI 值进行单位转换

转载 作者:行者123 更新时间:2023-11-28 06:10:44 30 4
gpt4 key购买 nike

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

结果:每次我在 UI 中单击一个字段时,data() 中的转换完成并且值被除,而不是先在 setData() 中乘以。一次又一次地点击该字段,该字段最终达到零值。

调用 setData() 有什么影响?

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

github 存储库中的代码现在已修复,可以按照解决方案按预期工作。完整代码:https://github.com/savolai/qsqltablemodel_conversion_example

主窗口.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"));





}

表格模型.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 原型(prototype)与原始原型(prototype)不匹配。

你有

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

什么时候应该有

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

关于c++ - 对 QSqlTableModel 中的 UI 值进行单位转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323975/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com