Qt:从一个QSqlTableMod在两个qlistview之间移动条目

2024-10-04 05:29:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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中,我正在编辑一个场景的内容。有这样一个界面:

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)

我希望箭头按钮将所选条目从一个列表移动到另一个列表,并希望apply按钮执行db中的更改。但是由于QSqlQueryModel的只读特性,这并不像我现在设置的那样是真的成立的。你知道吗

实现这一目标的最佳方法是什么?我假设我想实现我自己的QSqlTableModel,但是我不确定如何实现,而且我还没有找到任何与我的情况类似的好例子。也许我想得太多了。你知道吗

我在PYQT5中工作,但是我可以从C++翻译。你知道吗


Tags: keyfromcreatetableintegerscenewhereselect
1条回答
网友
1楼 · 发布于 2024-10-04 05:29:20

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

相关问题 更多 >