3

editlistofcustomers.h

QSqlRelationalTableModel *RelationalModel;
TreeModel *CategoriesModel;
QSqlRecord Record;

editlistofcustomers.cpp EditListOfCustomers ::EditListOfCustomers//コンストラクター

RelationalModel = new QSqlRelationalTableModel(this, *SupportObj->GetDataBase());
RelationalModel->setTable(SupportObj->GetCustomersTableName());
RelationalModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
RelationalModel->select();
RelationalModel->setHeaderData(1, Qt::Horizontal, QObject::tr("Название/имя покупателя"));
Record = RelationalModel->record();
RelationalModel->setRelation(2, QSqlRelation(SupportObj->GetCategoriesOfCustomersTableName(),
                         SupportObj->GetCategoriesOfCustomersPattern()[0].GetName(), // ID.
                         SupportObj->GetCategoriesOfCustomersPattern()[2].GetName())); // Name.
CategoriesModel = new TreeModel(QObject::tr("Категории"),
                SupportObj->GetCategoriesOfCustomersTableName(),
                SupportObj, this);


//Setup model view delegate.
ui->TV_ListOfCustomers->setModel(RelationalModel);
ui->TV_ListOfCustomers->setItemDelegate(new QSqlRelationalDelegate(ui->TV_ListOfCustomers));
ui->TV_ListOfCustomers->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->TV_ListOfCustomers->setSortingEnabled(true);

ui->TV_CategoryOfCustomer->setModel(CategoriesModel);
SupportObj->GetDataBase()->transaction()

EditListOfCustomers :: AddCustomer

QString customerName = ui->LE_CustomerName->text();
if(!customerName.isEmpty())
{
    Record.setValue(SupportObj->GetCustomersPattern()[1].GetName(), QVariant(customerName)); // Name.
    int categoryID = CategoriesModel->GetItemID(ui->TV_CategoryOfCustomer->currentIndex());
    Record.setValue(SupportObj->GetCustomersPattern()[2].GetName(), QVariant(categoryID)); // Category ID.
    Record.setValue(SupportObj->GetCustomersPattern()[3].GetName(), QVariant(ui->LE_CustomerTelephoneNumbers->text())); // Telephone numbers.
    Record.setValue(SupportObj->GetCustomersPattern()[4].GetName(), QVariant(ui->LE_CustomerAddress->text())); // Address.
    Record.setValue(SupportObj->GetCustomersPattern()[5].GetName(), QVariant(ui->TE_CustomerComment->toPlainText())); // Comment.
    RelationalModel->insertRecord(-1, Record);
    if(!RelationalModel->submitAll())
    {
        QMessageBox::warning(this, "CategoriesEditor::CategoriesEditor", SupportObj->GetDataBase()->lastError().text());
    }

    // Clear fields
    ui->LE_CustomerName->clear();
    ui->TV_CategoryOfCustomer->setCurrentIndex(QModelIndex());
    ui->LE_CustomerTelephoneNumbers->clear();
    ui->LE_CustomerAddress->clear();
    ui->TE_CustomerComment->clear();

    ui->LE_CustomerName->setFocus();
    ui->TV_ListOfCustomers->sortByColumn(0, Qt::AscendingOrder);
}

コメント「RelationalModel->setRelation(...)」の場合、トランザクション、追加、削除、コミット、ロールバックなど、すべてが正常に機能します。コメントを外すと何も機能しませんが、すべてが正しく表示されます(IDがカテゴリ名に置き換えられます)が、「insertRecord」を使用して新しい行を挿入できません。私はこの 提案を試みましたが、失敗しました。

なにか提案を?

4

2 に答える 2

4

問題は列名にありました。setRelation列名category_of_customer_idを に変更しますcategory_of_customers_name_2

void setValue(int index, const QVariant &val)の代わりにソリューションを使用しvoid setValue(const QString & name, const QVariant &val)ます。

QSqlRecord record = RelationalModel->record();
record.setValue(1, QVariant(customerName)); // Name.
int categoryID = CategoriesModel->GetItemID(ui->TV_CategoryOfCustomer->currentIndex());
record.setValue(2, QVariant(categoryID)); // Category ID.
record.setValue(3, QVariant(ui->LE_CustomerTelephoneNumbers->text())); // Telephone numbers.
record.setValue(4, QVariant(ui->LE_CustomerAddress->text())); // Address.
record.setValue(5, QVariant(ui->TE_CustomerComment->toPlainText())); // Comment.
RelationalModel->insertRecord(-1, record);
if(!RelationalModel->submitAll())
{
    QMessageBox::warning(this, "CategoriesEditor::CategoriesEditor", SupportObj->GetDataBase()->lastError().text());
}
于 2012-09-02T13:47:48.543 に答える
3

同じ問題がありました。これは、setRelation を持つフィールドに対してのみ発生する必要があります。PyQt のソリューションは次のとおりです。

def insertRow(self):      
    rec = self.record()
    rec.setValue("id", "new id")
    rec.setValue("type", 1)
    rec.setValue("title", "new title")
    return self.insertRecord(-1, rec)
    self.submit()

申し訳ありません。コメントしたかったのですが、まだ 50+ の評価を得ていません。

于 2014-06-10T08:03:35.673 に答える