Автоматическая отправка QDataWidgetMapper не работает - PullRequest
1 голос
/ 22 февраля 2011

Я создал базу данных sqld и заполнил ее некоторыми тестовыми данными. Я использую 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;
}

проблема в том, что автоматическая отправка не работает. Если я добавляю строки в QtableWidget (с тем же методом addRow) или если я изменяю / удаляю существующие строки (с тестовыми данными), ничего не происходит.

Или лучше графический интерфейс отражает изменения, но при повторном запуске приложения у меня та же дата тестирования, что и раньше.

Есть идеи? Есть ли способ проверить, что происходит с базой данных? Если бы это был обычный запрос q, я бы сделал q.lastError ().

спасибо

1 Ответ

2 голосов
/ 23 февраля 2011

Когда вы устанавливаете политику отправки для 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.

надеюсь, это поможет, с уважением

...