python — Qt: перемещение записей между двумя QListViews из одного QSqlTableModel

Моя база данных Sqlite выглядит так (упрощенно):

CREATE TABLE Scene(
sceneID INTEGER PRIMARY KEY,
title TEXT NOT NULL
);
CREATE TABLE Character(
characterID INTEGER PRIMARY KEY,
fullName TEXT NOT NULL
);
CREATE TABLE CharacterInScene(
characterID INTEGER,
sceneID INTEGER,
PRIMARY KEY(characterID, sceneID),
FOREIGN KEY(characterID) REFERENCES Character(characterID),
FOREIGN KEY(sceneID) REFERENCES Scene(sceneID)
);
INSERT INTO Scene (1, "Police Station");
INSERT INTO Character (1, "Harrison Ford");
INSERT INTO Character (2, "Rutger Hauer");
INSERT INTO CharacterInScene(1, 1);

Итак, у меня есть одна сцена, «Полицейский участок», в которой есть Харрисон Форд, но не Рутгер Хауэр. В моем интерфейсе я редактирую содержимое одной сцены. И иметь такой интерфейс:

UI

Прямо сейчас это два QListView, подключенных к двум моделям QSqlQueryModel со следующими запросами:

1. SELECT * FROM Character WHERE characterID NOT IN
(SELECT characterID FROM CharacterInScene WHERE sceneID=1)
2. SELECT * FROM Character WHERE characterID IN
(SELECT characterID FROM CharacterInScene WHERE sceneID=1)

Я хочу, чтобы кнопки со стрелками перемещали выбранную запись из одного списка в другой, а кнопка «Применить» для внесения изменений в БД. Но из-за природы QSqlQueryModel, доступной только для чтения, это не совсем корректно, так как я установил его сейчас.

Каков наилучший способ сделать это? Я предполагаю, что захочу реализовать свой собственный QSqlTableModel, но я не уверен, как, и я не смог найти хороших примеров, похожих на мою ситуацию. Может быть, я обдумываю это.

Я работаю в PyQt5, но я могу перевести с C ++.

1

Решение

Вам не нужно реализовывать какую-либо пользовательскую модель или делать QSqlQueryModel редактируемые, вставка и удаление записей. Вы можете сделать эту задачу с QSqlQuery и вызвать обновление моделей.

def addToScene(self):
for ix in self.notInScene.listView.selectionModel().selectedIndexes():
id = self.notInScene.model.record(ix.row()).value("characterID")
query = QSqlQuery()
query.prepare("INSERT INTO CharacterInScene VALUES (:characterID, :sceneID);")
query.bindValue(":characterID", id)
query.bindValue(":sceneID", self.sceneId)
if not query.exec_():
print(query.lastError().text())

self.updateList() # update the model

def removeFromScene(self):
for ix in self.inScene.listView.selectionModel().selectedIndexes():
id = self.inScene.model.record(ix.row()).value("characterID")
query = QSqlQuery()
query.prepare("DELETE FROM CharacterInScene WHERE characterID = :characterID AND sceneID = :sceneID;")
query.bindValue(":characterID", id)
query.bindValue(":sceneID", self.sceneId)
if not query.exec_():
print(query.lastError().text())
self.updateList() # update the model

Полный пример можно найти в следующем ссылка на сайт

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector