我有一個非常簡單的系統,在 SQLite DB 中有 2 個視圖,在桌面 Qt 小部件應用程式中有 2 個 tableViews:
- 第一個視圖是“seller_view”,它只是通過 QSqlTableModel 正確列印在 App 的 tableView 中。
- 其次是'customer_view'(設定與上面相同),它不列印任何資料,但顯示模型的標題,這是在建構式中設定的。
所以,我們遇到了一個奇怪的情況:
SQLiteStudio 中的 SQL 查看資料(查看 'customer_view')

模型設定
// model for tableView
model = new QSqlTableModel();
model->setTable("customer_view");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
updateView();
model->setHeaderData(0, Qt::Horizontal, tr("ID"));
model->setHeaderData(1, Qt::Horizontal, tr("?м'я")); // only organizations will have ipn
model->setHeaderData(2, Qt::Horizontal, tr("К-сть авто"));
model->setHeaderData(3, Qt::Horizontal, tr("Адреса"));
model->setHeaderData(4, Qt::Horizontal, tr("Номер"));
model->setHeaderData(5, Qt::Horizontal, tr("Ел.пошта"));
model->setHeaderData(6, Qt::Horizontal, tr("?БАН"));
model->setHeaderData(7, Qt::Horizontal, tr("Банк"));
model->setHeaderData(8, Qt::Horizontal, tr("?ДРПОУ"));
model->setHeaderData(9, Qt::Horizontal, tr("?ПН"));
ui->tableView->setModel(model);
ui->tableView->setColumnHidden(ID_COLUMN_INDEX, true); // hide ID
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
connect(model, &QSqlTableModel::dataChanged, this, &Customers::handleDataChange);
應用程式“customer_view”中的 QTableView

我有一些結論:
- QSqlTableModel 作業正常,因為表(視圖)名稱(我檢查了 10 次)是正確的,并且它正確顯示了列名稱,所以我可以說,tableView 模型設定沒問題。
- SQL 視圖是正確的,因為 SQLiteStudio 顯示了它應該顯示的資料。同樣,視圖的名稱是正確的
- 如果我將作業模型的 QSqlTableModel::setTable('seller_view') 替換為'customer_view',它不會按預期顯示資料。所以,我幾乎可以肯定問題出在 SQL 資料庫中。
PS:我還嘗試更改視圖名稱“customer_view”->“cus”。沒有改變
PSS:我以正確的方式設定資料庫,因為在 SQLiteStudio 中更改“賣家”資料會導致在 App 中更改“賣家視圖”。所以,'customer_view' 的問題是 100%,我很困惑。也許查詢會破壞我的資料庫?
SELECT customer.id,
customer.name,
COUNT(car.id),
customer.address,
customer.number,
customer.email,
customer.iban,
customer.bank,
customer.edrpoy,
customer.ipn
FROM customer
LEFT JOIN
car ON customer.id = car.customer_id
GROUP BY customer.id
PSSS:
void Customers::updateView()
{
model->select();
}
賣家查看 sql
SELECT seller.id,
seller.name,
seller.address,
seller.number,
seller.iban,
seller.bank,
seller.edrpoy,
seller.ipn
FROM seller
PSSSS(來自這些東西的所有東西都作業正常,并更新了 SQLiteStudio 中的表和視圖,但模型不像 Seller_view 那樣顯示):
void Customers::on_btn_add_clicked()
{
QSqlQuery qry;
qry.exec("INSERT INTO customer(name) VALUES(NULL)");
updateView();
}
void Customers::on_btn_del_clicked()
{
const auto selected_indexes = ui->tableView->selectionModel()->selectedIndexes();
QSqlQuery qry;
if (!selected_indexes.isEmpty())
{
qry.exec("PRAGMA foreign_keys=ON");
qry.exec("DELETE FROM customer WHERE id=" selected_indexes.at(0).siblingAtColumn(ID_COLUMN_INDEX)
.data(Qt::DisplayRole).toString()
);
}
updateView();
}
void Customers::handleDataChange(const QModelIndex &topLeft, const QModelIndex &)
{
const QVector<int> notEditableColumns = {
2 /* Cars count is NOT EDITABLE */
};
const int column = topLeft.column();
const QString data = topLeft.data(Qt::DisplayRole).toString();
const QString customer_id = topLeft.siblingAtColumn(ID_COLUMN_INDEX).data(Qt::DisplayRole).toString();
if (!notEditableColumns.contains(column)) {
switch (column) {
case 1: {
handleSimpleCellChange("name", data, customer_id);
} break;
case 3: {
handleSimpleCellChange("address", data, customer_id);
} break;
case 4: {
handleSimpleCellChange("number", data, customer_id);
} break;
case 5: {
handleSimpleCellChange("email", data, customer_id);
} break;
case 6: {
handleSimpleCellChange("iban", data, customer_id);
} break;
case 7: {
handleSimpleCellChange("bank", data, customer_id);
} break;
case 8: {
handleSimpleCellChange("edrpoy", data, customer_id);
} break;
case 9: {
handleSimpleCellChange("ipn", data, customer_id);
} break;
}
}
updateView();
}
void Customers::handleSimpleCellChange(const QString &columnName, const QString &data, const QString &customer_id)
{
QSqlQuery qry;
const QString query_str = "UPDATE customer SET %1=%2 WHERE id=%3";
qry.exec(query_str.arg(columnName, data, customer_id));
}
uj5u.com熱心網友回復:
由于您沒有使用模型直接寫入基礎表,因此我會QSqlQueryModel嘗試一下:只需使用它而不是QSqlTableModel,并替換您的
model->select();
和
model.setQuery("select * from customer_view");
由于此模型是只讀的,您可能希望完全放棄模型/視圖策略,并回退到使用 QSqlQuery 并使用其結果填充 QTableWidget。此方法應該比使用提供資料/setData 實作的子類模型更快,同時考慮到您已經撰寫了代碼以在單單元資料更改的基礎上編輯資料庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409540.html
標籤:
上一篇:我正在ExpandebleTableview創建一個演示,擴展作業正常...但是在點擊didselect行時遇到問題
