Или ты хочешь, чтобы тебе также вылетало предупреждение? Если да, то надо будет на нужный столбец/столбцы повесить свой делегат, и вот почему:
Когда ты всталяешь новую запись и не трогаешь это текстовое поле, то в модели там записан QVariant(QVariant::String) или QVariant(QString()), что тоже самое. В этом случае в это поле QSqlTableModel пытается запись в БД NULL-значение, которое запрещено по ограничению целостности.
НО когда ты щелкаешь по этому полю, делегат содает для него эдитор (скорей всего QLineEdit). Этот эдитор возвращает QString, который делегат запишет в модель. Так вот, если в эдиторе ничего не будет введено, то запишется пустая строка - "", то не "инвалид"
как раньше.
Короче, нужен делегат примерно с таким методом setModelData():
...
void TextDelegat::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QLineEdit *lineEdit = static_cast<QLineEdit *>(editor);
if (lineEdit->text().isEmpty()) {
model->setData(index, QVariant(QVariant::String), Qt::EditRole);
return;
}
model->setData(index, lineEdit->text(), Qt::EditRole);
}
...