QDataWidgetMapper autosubmit不起作用

时间:2011-02-22 11:31:25

标签: c++ sqlite qt4 symbian

我创建了一个sqldatabase并用一些测试数据填充它。我正在使用QDataWidgetMapper,我认为我连接正确,因为我可以使用以下代码读取测试记录:

    databaseManager = new DatabaseManager();
    dataMapper = new QDataWidgetMapper();
    dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
    dataMapper->setModel(databaseManager->getTableModel());

    // aggiungo una riga nella tabella ui per ogni riga nel database
    for(int i=0; i<databaseManager->getTableModel()->rowCount(); i++){
        this->addRow(); 
    }
   dataMapper->toFirst();

这是addRow()方法(在QTableWidget中创建行并将它们映射到模型):

int Widget::addRow(){
    int rowsNum = ui->moneyTableWidget->rowCount();
    ui->moneyTableWidget->insertRow(rowsNum);
    QLineEdit *newQLineEdit = new QLineEdit();
    QLineEdit *newItemLabel = new QLineEdit();

    QDoubleValidator *doubleValidator = new QDoubleValidator(0.0, 5.0, 2, this);
    newQLineEdit->setValidator(doubleValidator);

    QObject::connect(newQLineEdit, SIGNAL(textChanged(const QString &)),
                     this, SLOT(updateTotal()));
    ui->moneyTableWidget->setCellWidget(rowsNum, 0, newItemLabel);
    ui->moneyTableWidget->setCellWidget(rowsNum, 1, newQLineEdit);
       dataMapper->addMapping(newQLineEdit,databaseManager->getTableModel()->fieldIndex("price"), "text");
    dataMapper->addMapping(newItemLabel,databaseManager->getTableModel()->fieldIndex("item"), "text");

    return rowsNum;
}

问题是autosubmit不起作用。如果我向QtableWidget添加行(使用相同的addRow方法),或者如果我修改/删除现有行(具有测试数据的行),则不会发生任何事情。

或者更好的是gui反映了这些变化,但是重新运行应用程序我的测试日期与之前相同。

有什么想法吗?有没有办法测试数据库发生了什么?如果它是一个普通的查询q我会做一个q.lastError()。

感谢

1 个答案:

答案 0 :(得分:2)

当你为QDataWidgetMapper设置提交策略时,它定义了数据从小部件转移到模型的相应字段的方式。只要小部件失去焦点,AutoSubmit就会将数据传输到模型。如果要为模型的dataChanged信号定义处理程序,您应该能够跟踪模型的更改。

现在,根据您的描述,当您重新启动应用时,您似乎期望模型中存在新行。为了做到这一点,数据模型应该通过手动(QSqlTableModel::submitAll)调用提交更改以及在字段或行更改时自动提交。要为您的模型设置编辑策略,请使用QSqlTableModel::setEditStrategy之一,其中包含一个可能的值:

QSqlTableModel::OnFieldChange - All changes to the model will be applied immediately to the database.
QSqlTableModel::OnRowChange - Changes to a row will be applied when the user selects a different row.
QSqlTableModel::OnManualSubmit - All changes will be cached in the model until either submitAll() or revertAll() is called.

希望这有帮助,尊重