我的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);

因此,我只有一个场景“警察局”,其中包含Harrison Ford,但没有Rutger Hauer。在我的UI中,我正在编辑该场景的内容。并具有如下界面:

现在,这些是通过以下查询连接到两个QSqlQueryModel的两个QListView:
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)

我希望箭头按钮将选定的条目从一个列表移动到另一个列表,并希望应用按钮在db中执行更改。但是由于QSqlQueryModel的只读性质,因此按我现在设置的那样,这确实站不住脚。

做到这一点的最佳方法是什么?我假设我想实现自己的QSqlTableModel,但是我不确定如何实现,而且我也找不到任何类似于我的情况的好例子。也许我想得太多了。

我正在PyQt5中工作,但是我可以从C++翻译。

最佳答案

您不必实现任何自定义模型或使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

完整的示例可以在以下link中找到

关于python - Qt:从一个QSqlTableModel在两个QListViews之间移动条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47024950/

10-10 05:24